librfn
An ad-hoc utility library
messageq.h
Go to the documentation of this file.
1 /*
2  * messageq.h
3  *
4  * Part of librfn (a general utility library from redfelineninja.org.uk)
5  *
6  * Copyright (C) 2013-2014 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 Lesser General Public License as published
10  * by the Free Software Foundation; either version 3 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 
41 typedef struct {
42  char *basep;
43  uint16_t msg_len;
44  unsigned char queue_len;
45 
46  atomic_uchar num_free;
47  atomic_uchar sendp;
48  atomic_uint full_flags;
49 
50  unsigned char receivep;
51 
52 } messageq_t;
53 
54 #define MESSAGEQ_VAR_INIT(basep, base_len, msg_len) \
55  { \
56  (char *) (basep), \
57  (msg_len), \
58  ((base_len) / (msg_len)), \
59  ATOMIC_VAR_INIT(((base_len) / (msg_len))), \
60  ATOMIC_VAR_INIT(0), \
61  ATOMIC_VAR_INIT(0), \
62  0 \
63  }
64 
65 void messageq_init(messageq_t *mq, void *basep, size_t base_len, size_t msg_len);
66 
67 void *messageq_claim(messageq_t *mq);
68 void messageq_send(messageq_t *mq, void *msg);
69 void *messageq_receive(messageq_t *mq);
70 void messageq_release(messageq_t *mq, void *msg);
71 
72 static inline bool messageq_empty(messageq_t *mq)
73 {
74  return 0 == (atomic_load(&mq->full_flags) & (1 << mq->receivep));
75 }
76 
78 #endif // RF_MESSAGEQ_H_
void messageq_init(messageq_t *mq, void *basep, size_t base_len, size_t msg_len)
Definition: messageq.c:21
char * basep
Definition: messageq.h:42
void messageq_release(messageq_t *mq, void *msg)
Definition: messageq.c:73
atomic_uchar num_free
Definition: messageq.h:46
void * messageq_claim(messageq_t *mq)
Definition: messageq.c:31
atomic_uint full_flags
Definition: messageq.h:48
void * messageq_receive(messageq_t *mq)
Definition: messageq.c:57
unsigned char receivep
Definition: messageq.h:50
unsigned char queue_len
Definition: messageq.h:44
void messageq_send(messageq_t *mq, void *msg)
Definition: messageq.c:50
uint16_t msg_len
Definition: messageq.h:43
atomic_uchar sendp
Definition: messageq.h:47