librfn
An ad-hoc utility library
Data Structures | Macros | Functions
Message queue

Lockless message queue implementation using C11 atomic operations. More...

Data Structures

struct  messageq_t
 

Macros

#define MESSAGEQ_VAR_INIT(basep, base_len, msg_len)
 

Functions

void messageq_init (messageq_t *mq, void *basep, size_t base_len, size_t msg_len)
 
void * messageq_claim (messageq_t *mq)
 
void messageq_send (messageq_t *mq, void *msg)
 
void * messageq_receive (messageq_t *mq)
 
void messageq_release (messageq_t *mq, void *msg)
 

Detailed Description

Lockless message queue implementation using C11 atomic operations.

This is a lightweight memory based message queue capable of passing arbitrarily sized messages providing the size can be specified up front and the memory pre-allocated.

The message queue is thread safe for one-to-one and many-to-one messaging. It cannot be used to manage multiple receiver threads without additional external locking.

Note
The message queue implementation uses a bitfield to track state. For this reasons it cannot manage queues deeper than 32 messages.

Macro Definition Documentation

#define MESSAGEQ_VAR_INIT (   basep,
  base_len,
  msg_len 
)
Value:
{ \
(char *) (basep), \
(msg_len), \
((base_len) / (msg_len)), \
ATOMIC_VAR_INIT(((base_len) / (msg_len))), \
ATOMIC_VAR_INIT(0), \
ATOMIC_VAR_INIT(0), \
0 \
}

Definition at line 54 of file messageq.h.

Function Documentation

void* messageq_claim ( messageq_t mq)

Definition at line 31 of file messageq.c.

void messageq_init ( messageq_t mq,
void *  basep,
size_t  base_len,
size_t  msg_len 
)

Definition at line 21 of file messageq.c.

void* messageq_receive ( messageq_t mq)

Definition at line 57 of file messageq.c.

void messageq_release ( messageq_t mq,
void *  msg 
)

Definition at line 73 of file messageq.c.

void messageq_send ( messageq_t mq,
void *  msg 
)

Definition at line 50 of file messageq.c.