diff options
author | Lennart Poettering <lennart@poettering.net> | 2007-05-22 22:54:05 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2007-05-22 22:54:05 +0000 |
commit | da925cc7dff9ba59a748bcd658cf57153213bf61 (patch) | |
tree | 2dcda2652a6f82e603f5417abff0aa70a6978fb1 /asyncq.h | |
parent | c1b4872b0910c9aa784d878dca771b21c4690048 (diff) |
add asyncq
git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@31 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce
Diffstat (limited to 'asyncq.h')
-rw-r--r-- | asyncq.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/asyncq.h b/asyncq.h new file mode 100644 index 0000000..2e60c23 --- /dev/null +++ b/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 |