Skip to content

Lock-free MPSC singly-linked list

include/structures/mpsc_list.h View source View on GitHub
struct mpsc_slist_node {
    struct mpsc_slist_node  *next;
};
struct mpsc_slist {
    _Atomic (struct mpsc_slist_node *)  head;
};
void mpsc_slist_init(struct mpsc_slist *q);
int mpsc_slist_empty(const struct mpsc_slist *q);
bool mpsc_slist_push(struct mpsc_slist *q, struct mpsc_slist_node *n);
struct mpsc_slist_node mpsc_slist_drain(struct mpsc_slist *q);
struct mpsc_slist_node mpsc_slist_reverse(struct mpsc_slist_node *chain);
struct mpsc_slist_node mpsc_slist_pop_one(struct mpsc_slist *q);
#define MPSC_SLIST_INIT {NULL}
#define MPSC_SLIST(name) struct mpsc_slist name = MPSC_SLIST_INIT
#define mpsc_slist_entry(ptr, type, member) container_of(ptr, type, member)
#define mpsc_slist_for_each(pos, chain) \
    for (pos = (chain); pos; pos = pos->next)
#define mpsc_slist_for_each_safe(pos, n, chain) \
    for (pos = (chain), n = (pos) ? (pos)->next : NULL; pos; \
         pos = n, n = (pos) ? (pos)->next : NULL)
#define mpsc_slist_for_each_entry(pos, chain, member) \
    for (pos = (chain) ? mpsc_slist_entry((chain), typeof(*pos), member) \
                       : NULL; \
         pos; \
         pos = (pos)->member.next ? mpsc_slist_entry((pos)->member.next, \
                                                     typeof(*pos), member) \
                                  : NULL)