aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/lfmpscq.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/replicant/nu/lfmpscq.h')
-rw-r--r--Src/replicant/nu/lfmpscq.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/Src/replicant/nu/lfmpscq.h b/Src/replicant/nu/lfmpscq.h
new file mode 100644
index 00000000..c06f3331
--- /dev/null
+++ b/Src/replicant/nu/lfmpscq.h
@@ -0,0 +1,23 @@
+#pragma once
+#include "queue_node.h"
+
+/* lock free unbounded multiple producer, single consumer queue */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct mpscq_struct_t
+{
+ queue_node_t * volatile head;
+ queue_node_t *tail;
+ queue_node_t stub;
+} mpscq_t;
+
+#define MPSCQ_STATIC_INIT(self) {&self.stub, &self.stub, {0}}
+
+void mpscq_init(mpscq_t* self);
+int mpscq_push(mpscq_t *self, queue_node_t *n);
+queue_node_t *mpscq_pop(mpscq_t *self); /* returns (queue_node_t *)1 if the queue is busy */
+#ifdef __cplusplus
+}
+#endif