From 7d83e5c7816b5e343695a75ba58b32dbe1be969a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 1 Oct 2007 20:16:28 +0000 Subject: move all sources down to a seperate src/ tree git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@34 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce --- src/asyncq.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/asyncq.h (limited to 'src/asyncq.h') diff --git a/src/asyncq.h b/src/asyncq.h new file mode 100644 index 0000000..2e60c23 --- /dev/null +++ b/src/asyncq.h @@ -0,0 +1,49 @@ +#ifndef foosydneyhasynchfoo +#define foosydneyhasynchfoo + +#include "llist.h" +#include "mutex.h" + +typedef struct sa_asyncq sa_asyncq_t; +typedef struct sa_asyncq_item sa_asyncq_item_t; + +struct sa_asyncq_item { + SA_LLIST_ITEM(sa_asyncq_item_t, items); +}; + +#define SA_ASYNCQ_ITEM_DATA(x) ((void*) ((uint8_t*) (x) + ALIGN(sizeof(sa_asyncq_item_t)))) + +struct sa_asyncq { + sa_mutex_t *mutex; + + SA_LLIST_HEAD(sa_asyncq_item_t, items); + SA_LLIST_HEAD(sa_asyncq_item_t, unused); + + sa_asyncq_item_t *last; + + size_t item_size; +}; + +/* Implements a simple asynchronous queue for + * inter-thread-communication. To reading side can act in a wait-free + * fashion (though not lock-free). Should only be used together with a + * non-sychrnoized backing buffer such as sa_bufferq. */ + +int sa_asyncq_init(sa_asyncq_t *a, size_t item_size); + +void sa_asyncq_done(sa_asyncq_t *a); + +/* Allocate a free queue item */ +sa_asyncq_item_t *sa_asyncq_get(sa_asyncq_t *a); + +/* Give the queue item back to the queue */ +void sa_asyncq_recycle(sa_asyncq_t *a); + +/* Push a previously allocated entry into the queue */ +void sa_asyncq_push(sa_asyncq_t *a, sa_asyncq_item_t *i); + +/* Pop an entry from the queue */ +sa_asyncq_item_t* sa_asyncq_pop(sa_asyncq_t *a, int wait); + + +#endif -- cgit