X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=urcu%2Frculfqueue.h;h=fa54ca55a47d4a6b5e5368851abf53fde2b3fb8f;hp=f229cc77ca8d8a741a516dc4f3bbcae2cd67a90e;hb=a34df756f236349fc574f05ed3cf41c1c77771c6;hpb=3d02c34dba0edc4a3554a3862a2ae96d77b3b4e8 diff --git a/urcu/rculfqueue.h b/urcu/rculfqueue.h index f229cc7..fa54ca5 100644 --- a/urcu/rculfqueue.h +++ b/urcu/rculfqueue.h @@ -40,43 +40,54 @@ extern "C" { * which point their reference count will be decremented. */ -struct rcu_lfq_node { - struct rcu_lfq_node *next; +struct cds_lfq_queue_rcu; + +struct cds_lfq_node_rcu { + struct cds_lfq_node_rcu *next; struct urcu_ref ref; + struct cds_lfq_queue_rcu *queue; + struct rcu_head rcu_head; }; -struct rcu_lfq_queue { - struct rcu_lfq_node *head, *tail; - struct rcu_lfq_node init; /* Dummy initialization node */ +struct cds_lfq_queue_rcu { + struct cds_lfq_node_rcu *head, *tail; + struct cds_lfq_node_rcu init; /* Dummy initialization node */ + void (*release)(struct urcu_ref *ref); }; #ifdef _LGPL_SOURCE #include -#define rcu_lfq_node_init _rcu_lfq_node_init -#define rcu_lfq_init _rcu_lfq_init -#define rcu_lfq_enqueue _rcu_lfq_enqueue -#define rcu_lfq_dequeue _rcu_lfq_dequeue +#define cds_lfq_node_init_rcu _cds_lfq_node_init_rcu +#define cds_lfq_init_rcu _cds_lfq_init_rcu +#define cds_lfq_enqueue_rcu _cds_lfq_enqueue_rcu +#define cds_lfq_dequeue_rcu _cds_lfq_dequeue_rcu #else /* !_LGPL_SOURCE */ -extern void rcu_lfq_node_init(struct rcu_lfq_node *node); -extern void rcu_lfq_init(struct rcu_lfq_queue *q); -extern void rcu_lfq_enqueue(struct rcu_lfq_queue *q, struct rcu_lfq_node *node); +extern void cds_lfq_node_init_rcu(struct cds_lfq_node_rcu *node); +extern void cds_lfq_init_rcu(struct cds_lfq_queue_rcu *q, + void (*release)(struct urcu_ref *ref)); + +/* + * Should be called under rcu read lock critical section. + */ +extern void cds_lfq_enqueue_rcu(struct cds_lfq_queue_rcu *q, + struct cds_lfq_node_rcu *node); /* - * The entry returned by dequeue must be taken care of by doing a urcu_ref_put, - * which calls the release primitive when the reference count drops to zero. A - * grace period must be waited after execution of the release callback before - * performing the actual memory reclamation or modifying the rcu_lfq_node - * structure. + * Should be called under rcu read lock critical section. + * + * The entry returned by dequeue must be taken care of by doing a + * sequence of urcu_ref_put which release handler should do a call_rcu. + * * In other words, the entry lfq node returned by dequeue must not be * modified/re-used/freed until the reference count reaches zero and a grace * period has elapsed (after the refcount reached 0). */ -extern struct rcu_lfq_node * -rcu_lfq_dequeue(struct rcu_lfq_queue *q, void (*release)(struct urcu_ref *)); +extern +struct cds_lfq_node_rcu *cds_lfq_dequeue_rcu(struct cds_lfq_queue_rcu *q); #endif /* !_LGPL_SOURCE */