[lttng-dev] [PATCH 01/16] Fix: wfcqueue nonblocking dequeue

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Tue Nov 20 14:40:14 EST 2012


Failures were not handled in the nonblocking dequeue implementation.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 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;
+		}
 	}
 
 	/*
-- 
1.7.10.4




More information about the lttng-dev mailing list