urcu-call-rcu: use wait-free splice return value
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 20 Nov 2012 10:28:42 +0000 (05:28 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 5 Dec 2012 10:48:00 +0000 (05:48 -0500)
We can now use the splice return value to know if the source queue was
empty rather than testing for destination queue emptiness after the
splice operation.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
urcu-call-rcu-impl.h

index 5dfdb9277b5a351f62d09ee7b534f94c0a4ca3b5..6580397b1ee42b04a8e48b5c29a76220ea39b6d0 100644 (file)
@@ -252,11 +252,14 @@ static void *call_rcu_thread(void *arg)
                struct cds_wfcq_head cbs_tmp_head;
                struct cds_wfcq_tail cbs_tmp_tail;
                struct cds_wfcq_node *cbs, *cbs_tmp_n;
+               enum cds_wfcq_ret splice_ret;
 
                cds_wfcq_init(&cbs_tmp_head, &cbs_tmp_tail);
-               __cds_wfcq_splice_blocking(&cbs_tmp_head, &cbs_tmp_tail,
-                       &crdp->cbs_head, &crdp->cbs_tail);
-               if (!cds_wfcq_empty(&cbs_tmp_head, &cbs_tmp_tail)) {
+               splice_ret = __cds_wfcq_splice_blocking(&cbs_tmp_head,
+                       &cbs_tmp_tail, &crdp->cbs_head, &crdp->cbs_tail);
+               assert(splice_ret != CDS_WFCQ_RET_WOULDBLOCK);
+               assert(splice_ret != CDS_WFCQ_RET_DEST_NON_EMPTY);
+               if (splice_ret != CDS_WFCQ_RET_SRC_EMPTY) {
                        synchronize_rcu();
                        cbcount = 0;
                        __cds_wfcq_for_each_blocking_safe(&cbs_tmp_head,
This page took 0.027492 seconds and 4 git commands to generate.