struct __cds_lfs_stack *_s;
struct cds_lfs_stack *s;
} __attribute__((__transparent_union__)) cds_lfs_stack_ptr_t;
+
+typedef union {
+ const struct __cds_lfs_stack *_s;
+ const struct cds_lfs_stack *s;
+} __attribute__((__transparent_union__)) cds_lfs_stack_const_ptr_t;
#if defined(__clang__)
#pragma clang diagnostic pop
#endif
*
* No memory barrier is issued. No mutual exclusion is required.
*/
-extern bool cds_lfs_empty(cds_lfs_stack_ptr_t s);
+extern bool cds_lfs_empty(cds_lfs_stack_const_ptr_t s);
/*
* cds_lfs_push: push a node into the stack.
return ret;
}
+static inline cds_lfs_stack_const_ptr_t cds_lfs_stack_const_cast(const struct __cds_lfs_stack *s)
+{
+ cds_lfs_stack_const_ptr_t ret = {
+ ._s = s,
+ };
+ return ret;
+}
+
+static inline cds_lfs_stack_const_ptr_t cds_lfs_stack_const_cast(const struct cds_lfs_stack *s)
+{
+ cds_lfs_stack_const_ptr_t ret = {
+ .s = s,
+ };
+ return ret;
+}
+
template<typename T> static inline bool cds_lfs_empty(T s)
{
- return cds_lfs_empty(cds_lfs_stack_cast(s));
+ return cds_lfs_empty(cds_lfs_stack_const_cast(s));
}
template<typename T> static inline bool cds_lfs_push(T s,
}
static inline
-bool ___cds_lfs_empty_head(struct cds_lfs_head *head)
+bool ___cds_lfs_empty_head(const struct cds_lfs_head *head)
{
return head == NULL;
}
* No memory barrier is issued. No mutual exclusion is required.
*/
static inline
-bool _cds_lfs_empty(cds_lfs_stack_ptr_t s)
+bool _cds_lfs_empty(cds_lfs_stack_const_ptr_t s)
{
return ___cds_lfs_empty_head(uatomic_load(&s._s->head, CMM_RELAXED));
}
___cds_lfs_init(s);
}
-bool cds_lfs_empty(cds_lfs_stack_ptr_t s)
+bool cds_lfs_empty(cds_lfs_stack_const_ptr_t s)
{
return _cds_lfs_empty(s);
}