X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Fstatic%2Fwfcqueue.h;h=a284b580af7d8777087ba17e6094c40e03abecc9;hb=dfb65fd3cc75f660f35feedd2e14b000dbe39a4b;hp=8733771c462d4e51cb384ddd50fe4ba4f3af79f8;hpb=07c2a4fd64d456aec094e60c41a9287aa6ce2a6b;p=urcu.git 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; + } } /*