From: Mathieu Desnoyers Date: Tue, 20 Nov 2012 04:22:50 +0000 (-0500) Subject: Fix: wfcqueue nonblocking dequeue X-Git-Tag: v0.8.0~152 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=dfb65fd3cc75f660f35feedd2e14b000dbe39a4b Fix: wfcqueue nonblocking dequeue Failures were not handled in the nonblocking dequeue implementation. Signed-off-by: Mathieu Desnoyers --- 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; + } } /*