From dfb65fd3cc75f660f35feedd2e14b000dbe39a4b Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 19 Nov 2012 23:22:50 -0500 Subject: [PATCH] Fix: wfcqueue nonblocking dequeue Failures were not handled in the nonblocking dequeue implementation. Signed-off-by: Mathieu Desnoyers --- urcu/static/wfcqueue.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/urcu/static/wfcqueue.h b/urcu/static/wfcqueue.h index 8733771..a284b58 100644 --- a/urcu/static/wfcqueue.h +++ b/urcu/static/wfcqueue.h @@ -312,6 +312,8 @@ ___cds_wfcq_dequeue(struct cds_wfcq_head *head, return NULL; node = ___cds_wfcq_node_sync_next(&head->node, blocking); + if (!blocking && node == CDS_WFCQ_WOULDBLOCK) + return CDS_WFCQ_WOULDBLOCK; if ((next = CMM_LOAD_SHARED(node->next)) == NULL) { /* @@ -332,6 +334,15 @@ ___cds_wfcq_dequeue(struct cds_wfcq_head *head, if (uatomic_cmpxchg(&tail->p, node, &head->node) == node) return node; next = ___cds_wfcq_node_sync_next(node, blocking); + /* + * In nonblocking mode, if we would need to block to + * get node's next, set the head next node pointer + * (currently NULL) back to its original value. + */ + if (!blocking && next == CDS_WFCQ_WOULDBLOCK) { + head->node.next = node; + return CDS_WFCQ_WOULDBLOCK; + } } /* -- 2.34.1