From ae25b7e24f130728adfac25df56df8c6a220c719 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 20 Nov 2012 05:28:42 -0500 Subject: [PATCH] urcu-call-rcu: use wait-free splice return value 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 --- urcu-call-rcu-impl.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/urcu-call-rcu-impl.h b/urcu-call-rcu-impl.h index 5dfdb92..6580397 100644 --- a/urcu-call-rcu-impl.h +++ b/urcu-call-rcu-impl.h @@ -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, -- 2.34.1