wfcqueue: implement concurrency-efficient queue
[urcu.git] / wfcqueue.c
1 /*
2 * wfcqueue.c
3 *
4 * Userspace RCU library - Concurrent queue with Wait-Free Enqueue/Blocking Dequeue
5 *
6 * Copyright 2010-2012 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
7 * Copyright 2011-2012 - Lai Jiangshan <laijs@cn.fujitsu.com>
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 /* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
25 #include "urcu/wfcqueue.h"
26 #include "urcu/static/wfcqueue.h"
27
28 /*
29 * library wrappers to be used by non-LGPL compatible source code.
30 */
31
32 void cds_wfcq_node_init(struct cds_wfcq_node *node)
33 {
34 _cds_wfcq_node_init(node);
35 }
36
37 void cds_wfcq_init(struct cds_wfcq_head *head,
38 struct cds_wfcq_tail *tail)
39 {
40 _cds_wfcq_init(head, tail);
41 }
42
43 bool cds_wfcq_empty(struct cds_wfcq_head *head,
44 struct cds_wfcq_tail *tail)
45
46 {
47 return _cds_wfcq_empty(head, tail);
48 }
49
50 void cds_wfcq_enqueue(struct cds_wfcq_head *head,
51 struct cds_wfcq_tail *tail,
52 struct cds_wfcq_node *node)
53 {
54 _cds_wfcq_enqueue(head, tail, node);
55 }
56
57 void cds_wfcq_dequeue_lock(struct cds_wfcq_head *head,
58 struct cds_wfcq_tail *tail)
59 {
60 cds_wfcq_dequeue_lock(head, tail);
61 }
62
63 void cds_wfcq_dequeue_unlock(struct cds_wfcq_head *head,
64 struct cds_wfcq_tail *tail)
65 {
66 cds_wfcq_dequeue_unlock(head, tail);
67 }
68
69 struct cds_wfcq_node *cds_wfcq_dequeue_blocking(
70 struct cds_wfcq_head *head,
71 struct cds_wfcq_tail *tail)
72 {
73 return _cds_wfcq_dequeue_blocking(head, tail);
74 }
75
76 void cds_wfcq_splice_blocking(
77 struct cds_wfcq_head *dest_q_head,
78 struct cds_wfcq_tail *dest_q_tail,
79 struct cds_wfcq_head *src_q_head,
80 struct cds_wfcq_tail *src_q_tail)
81 {
82 _cds_wfcq_splice_blocking(dest_q_head, dest_q_tail,
83 src_q_head, src_q_tail);
84 }
85
86 struct cds_wfcq_node *__cds_wfcq_dequeue_blocking(
87 struct cds_wfcq_head *head,
88 struct cds_wfcq_tail *tail)
89 {
90 return ___cds_wfcq_dequeue_blocking(head, tail);
91 }
92
93 void __cds_wfcq_splice_blocking(
94 struct cds_wfcq_head *dest_q_head,
95 struct cds_wfcq_tail *dest_q_tail,
96 struct cds_wfcq_head *src_q_head,
97 struct cds_wfcq_tail *src_q_tail)
98 {
99 ___cds_wfcq_splice_blocking(dest_q_head, dest_q_tail,
100 src_q_head, src_q_tail);
101 }
102
103 struct cds_wfcq_node *__cds_wfcq_first_blocking(
104 struct cds_wfcq_head *head,
105 struct cds_wfcq_tail *tail)
106 {
107 return ___cds_wfcq_first_blocking(head, tail);
108 }
109
110 struct cds_wfcq_node *__cds_wfcq_next_blocking(
111 struct cds_wfcq_head *head,
112 struct cds_wfcq_tail *tail,
113 struct cds_wfcq_node *node)
114 {
115 return ___cds_wfcq_next_blocking(head, tail, node);
116 }
This page took 0.043594 seconds and 5 git commands to generate.