summaryrefslogtreecommitdiff
path: root/deps/jemalloc/test/include/test/mq.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/jemalloc/test/include/test/mq.h')
-rw-r--r--deps/jemalloc/test/include/test/mq.h107
1 files changed, 0 insertions, 107 deletions
diff --git a/deps/jemalloc/test/include/test/mq.h b/deps/jemalloc/test/include/test/mq.h
deleted file mode 100644
index af2c078da..000000000
--- a/deps/jemalloc/test/include/test/mq.h
+++ /dev/null
@@ -1,107 +0,0 @@
-void mq_nanosleep(unsigned ns);
-
-/*
- * Simple templated message queue implementation that relies on only mutexes for
- * synchronization (which reduces portability issues). Given the following
- * setup:
- *
- * typedef struct mq_msg_s mq_msg_t;
- * struct mq_msg_s {
- * mq_msg(mq_msg_t) link;
- * [message data]
- * };
- * mq_gen(, mq_, mq_t, mq_msg_t, link)
- *
- * The API is as follows:
- *
- * bool mq_init(mq_t *mq);
- * void mq_fini(mq_t *mq);
- * unsigned mq_count(mq_t *mq);
- * mq_msg_t *mq_tryget(mq_t *mq);
- * mq_msg_t *mq_get(mq_t *mq);
- * void mq_put(mq_t *mq, mq_msg_t *msg);
- *
- * The message queue linkage embedded in each message is to be treated as
- * externally opaque (no need to initialize or clean up externally). mq_fini()
- * does not perform any cleanup of messages, since it knows nothing of their
- * payloads.
- */
-#define mq_msg(a_mq_msg_type) ql_elm(a_mq_msg_type)
-
-#define mq_gen(a_attr, a_prefix, a_mq_type, a_mq_msg_type, a_field) \
-typedef struct { \
- mtx_t lock; \
- ql_head(a_mq_msg_type) msgs; \
- unsigned count; \
-} a_mq_type; \
-a_attr bool \
-a_prefix##init(a_mq_type *mq) { \
- \
- if (mtx_init(&mq->lock)) { \
- return true; \
- } \
- ql_new(&mq->msgs); \
- mq->count = 0; \
- return false; \
-} \
-a_attr void \
-a_prefix##fini(a_mq_type *mq) { \
- mtx_fini(&mq->lock); \
-} \
-a_attr unsigned \
-a_prefix##count(a_mq_type *mq) { \
- unsigned count; \
- \
- mtx_lock(&mq->lock); \
- count = mq->count; \
- mtx_unlock(&mq->lock); \
- return count; \
-} \
-a_attr a_mq_msg_type * \
-a_prefix##tryget(a_mq_type *mq) { \
- a_mq_msg_type *msg; \
- \
- mtx_lock(&mq->lock); \
- msg = ql_first(&mq->msgs); \
- if (msg != NULL) { \
- ql_head_remove(&mq->msgs, a_mq_msg_type, a_field); \
- mq->count--; \
- } \
- mtx_unlock(&mq->lock); \
- return msg; \
-} \
-a_attr a_mq_msg_type * \
-a_prefix##get(a_mq_type *mq) { \
- a_mq_msg_type *msg; \
- unsigned ns; \
- \
- msg = a_prefix##tryget(mq); \
- if (msg != NULL) { \
- return msg; \
- } \
- \
- ns = 1; \
- while (true) { \
- mq_nanosleep(ns); \
- msg = a_prefix##tryget(mq); \
- if (msg != NULL) { \
- return msg; \
- } \
- if (ns < 1000*1000*1000) { \
- /* Double sleep time, up to max 1 second. */ \
- ns <<= 1; \
- if (ns > 1000*1000*1000) { \
- ns = 1000*1000*1000; \
- } \
- } \
- } \
-} \
-a_attr void \
-a_prefix##put(a_mq_type *mq, a_mq_msg_type *msg) { \
- \
- mtx_lock(&mq->lock); \
- ql_elm_new(msg, a_field); \
- ql_tail_insert(&mq->msgs, msg, a_field); \
- mq->count++; \
- mtx_unlock(&mq->lock); \
-}