23 memset(mq, 0,
sizeof(*mq));
28 atomic_store(&mq->
num_free, base_len / msg_len);
34 int num_free = atomic_fetch_sub(&mq->
num_free, 1);
41 unsigned char sendp = atomic_load(&mq->
sendp);
42 unsigned char newsendp;
44 newsendp = (sendp >= (mq->
queue_len-1) ? 0 : sendp+1);
45 }
while(!atomic_compare_exchange_weak(&mq->
sendp, &sendp, newsendp));
52 unsigned int offset = (((
char *) msg) - mq->
basep);
53 unsigned int sendp = offset / mq->
msg_len;
54 atomic_fetch_or(&mq->
full_flags, (1 << sendp));
59 unsigned int receivep = mq->
receivep;
60 unsigned int full_flags = atomic_fetch_and(
63 if (0 == (full_flags & (1 << receivep)))
67 (receivep >= (
unsigned int)(mq->
queue_len - 1) ? 0 : receivep + 1);
void messageq_init(messageq_t *mq, void *basep, size_t base_len, size_t msg_len)
void messageq_release(messageq_t *mq, void *msg)
void * messageq_claim(messageq_t *mq)
void * messageq_receive(messageq_t *mq)
void messageq_send(messageq_t *mq, void *msg)