From: Lai Jiangshan Date: Thu, 9 Aug 2012 14:24:38 +0000 (-0400) Subject: urcu: move busy-wait code and name it ___cds_wfq_node_sync_next() X-Git-Tag: v0.7.4~4 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=b9103f30e18bf81ffbebb6a23215f19f621cd76b;p=userspace-rcu.git urcu: move busy-wait code and name it ___cds_wfq_node_sync_next() This code which waits for a node's next pointer until it appears, will be used many times, move it to a help function and name it ___cds_wfq_node_sync_next(). Signed-off-by: Lai Jiangshan Signed-off-by: Mathieu Desnoyers --- diff --git a/urcu/static/wfqueue.h b/urcu/static/wfqueue.h index 19314f5..636e1af 100644 --- a/urcu/static/wfqueue.h +++ b/urcu/static/wfqueue.h @@ -84,6 +84,29 @@ static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q, CMM_STORE_SHARED(*old_tail, node); } +/* + * Waiting for enqueuer to complete enqueue and return the next node + */ +static inline struct cds_wfq_node * +___cds_wfq_node_sync_next(struct cds_wfq_node *node) +{ + struct cds_wfq_node *next; + int attempt = 0; + + /* + * Adaptative busy-looping waiting for enqueuer to complete enqueue. + */ + while ((next = CMM_LOAD_SHARED(node->next)) == NULL) { + if (++attempt >= WFQ_ADAPT_ATTEMPTS) { + poll(NULL, 0, WFQ_WAIT); /* Wait for 10ms */ + attempt = 0; + } else + caa_cpu_relax(); + } + + return next; +} + /* * It is valid to reuse and free a dequeued node immediately. * @@ -96,7 +119,6 @@ static inline struct cds_wfq_node * ___cds_wfq_dequeue_blocking(struct cds_wfq_queue *q) { struct cds_wfq_node *node, *next; - int attempt = 0; /* * Queue is empty if it only contains the dummy node. @@ -105,16 +127,8 @@ ___cds_wfq_dequeue_blocking(struct cds_wfq_queue *q) return NULL; node = q->head; - /* - * Adaptative busy-looping waiting for enqueuer to complete enqueue. - */ - while ((next = CMM_LOAD_SHARED(node->next)) == NULL) { - if (++attempt >= WFQ_ADAPT_ATTEMPTS) { - poll(NULL, 0, WFQ_WAIT); /* Wait for 10ms */ - attempt = 0; - } else - caa_cpu_relax(); - } + next = ___cds_wfq_node_sync_next(node); + /* * Move queue head forward. */