X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Fwfcqueue.h;h=6c6ebba9e4453257da70484cecc6840bbdab0364;hp=c0bb289741171e2fb8bbec203e69b4432bb96f21;hb=200d100e05ed8e10c47f971939042f2406df92ef;hpb=0b73c81945fe88ff1c44a24d947851e30009c643 diff --git a/urcu/wfcqueue.h b/urcu/wfcqueue.h index c0bb289..6c6ebba 100644 --- a/urcu/wfcqueue.h +++ b/urcu/wfcqueue.h @@ -74,6 +74,7 @@ struct cds_wfcq_head { pthread_mutex_t lock; }; +#ifndef __cplusplus /* * The transparent union allows calling functions that work on both * struct cds_wfcq_head and struct __cds_wfcq_head on any of those two @@ -84,6 +85,45 @@ typedef union { struct cds_wfcq_head *h; } __attribute__((__transparent_union__)) cds_wfcq_head_ptr_t; +/* + * This static inline is only present for compatibility with C++. It is + * effect-less in C. + */ +static inline struct __cds_wfcq_head *__cds_wfcq_head_cast(struct __cds_wfcq_head *head) +{ + return head; +} + +/* + * This static inline is only present for compatibility with C++. It is + * effect-less in C. + */ +static inline struct cds_wfcq_head *cds_wfcq_head_cast(struct cds_wfcq_head *head) +{ + return head; +} +#else /* #ifndef __cplusplus */ + +/* C++ ignores transparent union. */ +typedef union { + struct __cds_wfcq_head *_h; + struct cds_wfcq_head *h; +} cds_wfcq_head_ptr_t; + +/* C++ ignores transparent union. Requires an explicit conversion. */ +static inline cds_wfcq_head_ptr_t __cds_wfcq_head_cast(struct __cds_wfcq_head *head) +{ + cds_wfcq_head_ptr_t ret = { ._h = head }; + return ret; +} +/* C++ ignores transparent union. Requires an explicit conversion. */ +static inline cds_wfcq_head_ptr_t cds_wfcq_head_cast(struct cds_wfcq_head *head) +{ + cds_wfcq_head_ptr_t ret = { .h = head }; + return ret; +} +#endif /* #else #ifndef __cplusplus */ + struct cds_wfcq_tail { struct cds_wfcq_node *p; }; @@ -94,6 +134,8 @@ struct cds_wfcq_tail { #define cds_wfcq_node_init _cds_wfcq_node_init #define cds_wfcq_init _cds_wfcq_init +#define __cds_wfcq_init ___cds_wfcq_init +#define cds_wfcq_destroy _cds_wfcq_destroy #define cds_wfcq_empty _cds_wfcq_empty #define cds_wfcq_enqueue _cds_wfcq_enqueue @@ -172,13 +214,22 @@ struct cds_wfcq_tail { extern void cds_wfcq_node_init(struct cds_wfcq_node *node); /* - * cds_wfcq_init: initialize wait-free queue. + * cds_wfcq_init: initialize wait-free queue. Pair with + * cds_wfcq_destroy(). */ extern void cds_wfcq_init(struct cds_wfcq_head *head, struct cds_wfcq_tail *tail); /* - * __cds_wfcq_init: initialize wait-free queue. + * cds_wfcq_destroy: destroy wait-free queue. Pair with + * cds_wfcq_init(). + */ +extern void cds_wfcq_destroy(struct cds_wfcq_head *head, + struct cds_wfcq_tail *tail); + +/* + * __cds_wfcq_init: initialize wait-free queue (without lock). Don't + * pair with any destroy function. */ extern void __cds_wfcq_init(struct __cds_wfcq_head *head, struct cds_wfcq_tail *tail);