X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Fstatic%2Flfstack.h;h=9531de5bb951f31c47bfc51ef2f8ff9a343cc0fc;hb=32921450bb2907c334b868799d2de0a8f165302a;hp=0be959436e7d4577c4e6e7673dad6b49fae74469;hpb=ffa11a1830c532f3b052146eb9f0dd450cb2a0f2;p=urcu.git diff --git a/urcu/static/lfstack.h b/urcu/static/lfstack.h index 0be9594..9531de5 100644 --- a/urcu/static/lfstack.h +++ b/urcu/static/lfstack.h @@ -36,6 +36,8 @@ extern "C" { #endif +#define CDS_LFS_END NULL + /* * Lock-free stack. * @@ -73,15 +75,24 @@ void _cds_lfs_init(struct cds_lfs_stack *s) { int ret; - s->head = NULL; + s->head = CDS_LFS_END; ret = pthread_mutex_init(&s->lock, NULL); assert(!ret); } +/* + * ___cds_lfs_init: initialize lock-free stack. + */ +static inline +void ___cds_lfs_init(struct __cds_lfs_stack *s) +{ + s->head = CDS_LFS_END; +} + static inline bool ___cds_lfs_empty_head(struct cds_lfs_head *head) { - return head == NULL; + return head == CDS_LFS_END; } /* @@ -90,9 +101,9 @@ bool ___cds_lfs_empty_head(struct cds_lfs_head *head) * No memory barrier is issued. No mutual exclusion is required. */ static inline -bool _cds_lfs_empty(struct cds_lfs_stack *s) +bool _cds_lfs_empty(cds_lfs_stack_ptr_t s) { - return ___cds_lfs_empty_head(CMM_LOAD_SHARED(s->head)); + return ___cds_lfs_empty_head(CMM_LOAD_SHARED(s._s->head)); } /* @@ -125,10 +136,11 @@ bool _cds_lfs_empty(struct cds_lfs_stack *s) * Returns non-zero otherwise. */ static inline -bool _cds_lfs_push(struct cds_lfs_stack *s, +bool _cds_lfs_push(cds_lfs_stack_ptr_t u_s, struct cds_lfs_node *node) { - struct cds_lfs_head *head = NULL; + struct __cds_lfs_stack *s = u_s._s; + struct cds_lfs_head *head = CDS_LFS_END; struct cds_lfs_head *new_head = caa_container_of(node, struct cds_lfs_head, node); @@ -168,8 +180,10 @@ bool _cds_lfs_push(struct cds_lfs_stack *s, * __cds_lfs_pop_all(). (multi-provider/single-consumer scheme). */ static inline -struct cds_lfs_node *___cds_lfs_pop(struct cds_lfs_stack *s) +struct cds_lfs_node *___cds_lfs_pop(cds_lfs_stack_ptr_t u_s) { + struct __cds_lfs_stack *s = u_s._s; + for (;;) { struct cds_lfs_head *head, *next_head; struct cds_lfs_node *next; @@ -211,8 +225,10 @@ struct cds_lfs_node *___cds_lfs_pop(struct cds_lfs_stack *s) * __cds_lfs_pop_all(). (multi-provider/single-consumer scheme). */ static inline -struct cds_lfs_head *___cds_lfs_pop_all(struct cds_lfs_stack *s) +struct cds_lfs_head *___cds_lfs_pop_all(cds_lfs_stack_ptr_t u_s) { + struct __cds_lfs_stack *s = u_s._s; + /* * Implicit memory barrier after uatomic_xchg() matches implicit * memory barrier before uatomic_cmpxchg() in cds_lfs_push. It @@ -223,7 +239,7 @@ struct cds_lfs_head *___cds_lfs_pop_all(struct cds_lfs_stack *s) * taking care to order writes to each node prior to the full * memory barrier after this uatomic_xchg(). */ - return uatomic_xchg(&s->head, NULL); + return uatomic_xchg(&s->head, CDS_LFS_END); } /*