aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/lfmpscq.h
blob: c06f3331154d0b18d59e0aacb594055d95cb4ffa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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