[lttng-dev] [PATCH 1/2] urcu: move exsit code and name it ___cds_wfq_node_sync_next()

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Aug 9 10:25:36 EDT 2012


* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> 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().

Merged as:


commit b9103f30e18bf81ffbebb6a23215f19f621cd76b
Author: Lai Jiangshan <laijs at cn.fujitsu.com>
Date:   Thu Aug 9 10:24:38 2012 -0400

    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 <laijs at cn.fujitsu.com>
    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>

Thanks!

Mathieu


> 
> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
> ---
>  urcu/static/wfqueue.h |   36 +++++++++++++++++++++++++-----------
>  1 files changed, 25 insertions(+), 11 deletions(-)
> 
> 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
> @@ -85,6 +85,29 @@ static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q,
>  }
>  
>  /*
> + * 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.
>   *
>   * No need to go on a waitqueue here, as there is no possible state in which the
> @@ -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.
>  	 */
> -- 
> 1.7.7
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list