*/
#include <urcu/uatomic.h>
-/* A urcu implementation header should be already included. */
#ifdef __cplusplus
extern "C" {
#endif
+static inline
void _cds_lfs_node_init_rcu(struct cds_lfs_node_rcu *node)
{
}
+static inline
void _cds_lfs_init_rcu(struct cds_lfs_stack_rcu *s)
{
s->head = NULL;
}
+static inline
void _cds_lfs_push_rcu(struct cds_lfs_stack_rcu *s, struct cds_lfs_node_rcu *node)
{
struct cds_lfs_node_rcu *head = NULL;
}
/*
- * Should be called under rcu read-side lock.
+ * Acts as a RCU reader.
*
* The caller must wait for a grace period to pass before freeing the returned
* node or modifying the cds_lfs_node_rcu structure.
* Returns NULL if stack is empty.
*/
+static inline
struct cds_lfs_node_rcu *
_cds_lfs_pop_rcu(struct cds_lfs_stack_rcu *s)
{
for (;;) {
struct cds_lfs_node_rcu *head;
+ rcu_read_lock();
head = rcu_dereference(s->head);
if (head) {
struct cds_lfs_node_rcu *next = rcu_dereference(head->next);
if (uatomic_cmpxchg(&s->head, head, next) == head) {
+ rcu_read_unlock();
return head;
} else {
/* Concurrent modification. Retry. */
+ rcu_read_unlock();
continue;
}
} else {
/* Empty stack */
+ rcu_read_unlock();
return NULL;
}
}