X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fstatic%2Fwfcqueue.h;h=67ac05ffd15e384dc42317e0d5b4d0c93d71c2d6;hp=48b2625dd3a4d0b28450dac4d7d0f7df921028c7;hb=200d100e05ed8e10c47f971939042f2406df92ef;hpb=f637f191d0939dccf3f5c9bab74bba70cfd45fc4 diff --git a/urcu/static/wfcqueue.h b/urcu/static/wfcqueue.h index 48b2625..67ac05f 100644 --- a/urcu/static/wfcqueue.h +++ b/urcu/static/wfcqueue.h @@ -92,7 +92,8 @@ static inline void _cds_wfcq_node_init(struct cds_wfcq_node *node) } /* - * cds_wfcq_init: initialize wait-free queue. + * cds_wfcq_init: initialize wait-free queue (with lock). Pair with + * cds_wfcq_destroy(). */ static inline void _cds_wfcq_init(struct cds_wfcq_head *head, struct cds_wfcq_tail *tail) @@ -107,7 +108,19 @@ static inline void _cds_wfcq_init(struct cds_wfcq_head *head, } /* - * __cds_wfcq_init: initialize wait-free queue. + * cds_wfcq_destroy: destroy wait-free queue (with lock). Pair with + * cds_wfcq_init(). + */ +static inline void _cds_wfcq_destroy(struct cds_wfcq_head *head, + struct cds_wfcq_tail *tail) +{ + int ret = pthread_mutex_destroy(&head->lock); + assert(!ret); +} + +/* + * __cds_wfcq_init: initialize wait-free queue (without lock). Don't + * pair with any destroy function. */ static inline void ___cds_wfcq_init(struct __cds_wfcq_head *head, struct cds_wfcq_tail *tail) @@ -221,7 +234,7 @@ ___cds_wfcq_busy_wait(int *attempt, int blocking) if (!blocking) return 1; if (++(*attempt) >= WFCQ_ADAPT_ATTEMPTS) { - poll(NULL, 0, WFCQ_WAIT); /* Wait for 10ms */ + (void) poll(NULL, 0, WFCQ_WAIT); /* Wait for 10ms */ *attempt = 0; } else { caa_cpu_relax(); @@ -257,7 +270,7 @@ ___cds_wfcq_first(cds_wfcq_head_ptr_t u_head, struct __cds_wfcq_head *head = u_head._h; struct cds_wfcq_node *node; - if (_cds_wfcq_empty(head, tail)) + if (_cds_wfcq_empty(__cds_wfcq_head_cast(head), tail)) return NULL; node = ___cds_wfcq_node_sync_next(&head->node, blocking); /* Load head->node.next before loading node's content */ @@ -375,7 +388,7 @@ ___cds_wfcq_dequeue_with_state(cds_wfcq_head_ptr_t u_head, if (state) *state = 0; - if (_cds_wfcq_empty(head, tail)) { + if (_cds_wfcq_empty(__cds_wfcq_head_cast(head), tail)) { return NULL; } @@ -509,7 +522,7 @@ ___cds_wfcq_splice( * Initial emptiness check to speed up cases where queue is * empty: only require loads to check if queue is empty. */ - if (_cds_wfcq_empty(src_q_head, src_q_tail)) + if (_cds_wfcq_empty(__cds_wfcq_head_cast(src_q_head), src_q_tail)) return CDS_WFCQ_RET_SRC_EMPTY; for (;;) { @@ -539,7 +552,8 @@ ___cds_wfcq_splice( * Append the spliced content of src_q into dest_q. Does not * require mutual exclusion on dest_q (wait-free). */ - if (___cds_wfcq_append(dest_q_head, dest_q_tail, head, tail)) + if (___cds_wfcq_append(__cds_wfcq_head_cast(dest_q_head), dest_q_tail, + head, tail)) return CDS_WFCQ_RET_DEST_NON_EMPTY; else return CDS_WFCQ_RET_DEST_EMPTY; @@ -599,7 +613,8 @@ _cds_wfcq_dequeue_with_state_blocking(struct cds_wfcq_head *head, struct cds_wfcq_node *retval; _cds_wfcq_dequeue_lock(head, tail); - retval = ___cds_wfcq_dequeue_with_state_blocking(head, tail, state); + retval = ___cds_wfcq_dequeue_with_state_blocking(cds_wfcq_head_cast(head), + tail, state); _cds_wfcq_dequeue_unlock(head, tail); return retval; } @@ -638,8 +653,8 @@ _cds_wfcq_splice_blocking( enum cds_wfcq_ret ret; _cds_wfcq_dequeue_lock(src_q_head, src_q_tail); - ret = ___cds_wfcq_splice_blocking(dest_q_head, dest_q_tail, - src_q_head, src_q_tail); + ret = ___cds_wfcq_splice_blocking(cds_wfcq_head_cast(dest_q_head), dest_q_tail, + cds_wfcq_head_cast(src_q_head), src_q_tail); _cds_wfcq_dequeue_unlock(src_q_head, src_q_tail); return ret; }