librfn/messageq: Lock-free N:1 message queue implementation
[tintamp:tintamp.git] / src / librfn / include / librfn / messageq.h
1 /*
2  * messageq.h
3  *
4  * Part of librfn (a general utility library from redfelineninja.org.uk)
5  *
6  * Copyright (C) 2013 Daniel Thompson <daniel@redfelineninja.org.uk>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13
14 #ifndef RF_MESSAGEQ_H_
15 #define RF_MESSAGEQ_H_
16
17 #include <stdbool.h>
18 #include <stddef.h>
19 #include <stdint.h>
20
21 #include "atomic.h"
22
23 typedef struct {
24         char *basep;
25         uint16_t msg_len;
26         unsigned char queue_len;
27
28         atomic_uchar num_free;
29         atomic_uchar sendp;
30         atomic_uint full_flags;
31
32         unsigned char receivep;
33
34 } messageq_t;
35
36 #define MESSAGEQ_VAR_INIT(basep, base_len, msg_len) \
37         { \
38                 (char *) (basep), \
39                 (msg_len), \
40                 ((base_len) / (msg_len)), \
41                 ((base_len) / (msg_len)) \
42         }
43
44 void messageq_init(messageq_t *mq, void *basep, size_t base_len, size_t msg_len);
45
46 void *messageq_claim(messageq_t *mq);
47 void messageq_send(messageq_t *mq, void *msg);
48 void *messageq_receive(messageq_t *mq);
49 void messageq_release(messageq_t *mq, void *msg);
50
51 #endif // RF_MESSAGEQ_H_