-void rcu_lfq_node_init(struct rcu_lfq_node *node)
-{
- node->next = NULL;
- urcu_ref_init(&node->ref);
-}
-
-void rcu_lfq_init(struct rcu_lfq_queue *q)
-{
- rcu_lfq_node_init(&q->init);
- /* Make sure the initial node is never freed. */
- urcu_ref_set(&q->init.ref, URCU_LFQ_PERMANENT_REF);
- q->head = q->tail = &q->init;
-}
+#ifdef _LGPL_SOURCE
+
+#include <urcu/static/rculfqueue.h>
+
+#define cds_lfq_node_init_rcu_qsbr _cds_lfq_node_init_rcu
+#define cds_lfq_init_rcu_qsbr _cds_lfq_init_rcu
+#define cds_lfq_destroy_rcu_qsbr _cds_lfq_destroy_rcu
+#define cds_lfq_enqueue_rcu_qsbr _cds_lfq_enqueue_rcu
+#define cds_lfq_dequeue_rcu_qsbr _cds_lfq_dequeue_rcu
+
+#define cds_lfq_node_init_rcu_bp _cds_lfq_node_init_rcu
+#define cds_lfq_init_rcu_bp _cds_lfq_init_rcu
+#define cds_lfq_destroy_rcu_bp _cds_lfq_destroy_rcu
+#define cds_lfq_enqueue_rcu_bp _cds_lfq_enqueue_rcu
+#define cds_lfq_dequeue_rcu_bp _cds_lfq_dequeue_rcu
+
+#define cds_lfq_node_init_rcu_memb _cds_lfq_node_init_rcu
+#define cds_lfq_init_rcu_memb _cds_lfq_init_rcu
+#define cds_lfq_destroy_rcu_memb _cds_lfq_destroy_rcu
+#define cds_lfq_enqueue_rcu_memb _cds_lfq_enqueue_rcu
+#define cds_lfq_dequeue_rcu_memb _cds_lfq_dequeue_rcu
+
+#define cds_lfq_node_init_rcu_mb _cds_lfq_node_init_rcu
+#define cds_lfq_init_rcu_mb _cds_lfq_init_rcu
+#define cds_lfq_destroy_rcu_mb _cds_lfq_destroy_rcu
+#define cds_lfq_enqueue_rcu_mb _cds_lfq_enqueue_rcu
+#define cds_lfq_dequeue_rcu_mb _cds_lfq_dequeue_rcu
+
+#define cds_lfq_node_init_rcu_sig _cds_lfq_node_init_rcu
+#define cds_lfq_init_rcu_sig _cds_lfq_init_rcu
+#define cds_lfq_destroy_rcu_sig _cds_lfq_destroy_rcu
+#define cds_lfq_enqueue_rcu_sig _cds_lfq_enqueue_rcu
+#define cds_lfq_dequeue_rcu_sig _cds_lfq_dequeue_rcu
+
+#else /* !_LGPL_SOURCE */
+
+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 queue_call_rcu(struct rcu_head *head,
+ void (*func)(struct rcu_head *head)));
+/*
+ * The queue should be emptied before calling destroy.
+ *
+ * Return 0 on success, -EPERM if queue is not empty.
+ */
+extern int cds_lfq_destroy_rcu(struct cds_lfq_queue_rcu *q);