Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 1 | #include "test/jemalloc_test.h" |
| 2 | |
| 3 | #define NSENDERS 3 |
| 4 | #define NMSGS 100000 |
| 5 | |
| 6 | typedef struct mq_msg_s mq_msg_t; |
| 7 | struct mq_msg_s { |
| 8 | mq_msg(mq_msg_t) link; |
| 9 | }; |
| 10 | mq_gen(static, mq_, mq_t, mq_msg_t, link) |
| 11 | |
| 12 | TEST_BEGIN(test_mq_basic) |
| 13 | { |
| 14 | mq_t mq; |
| 15 | mq_msg_t msg; |
| 16 | |
| 17 | assert_false(mq_init(&mq), "Unexpected mq_init() failure"); |
| 18 | assert_u_eq(mq_count(&mq), 0, "mq should be empty"); |
| 19 | assert_ptr_null(mq_tryget(&mq), |
| 20 | "mq_tryget() should fail when the queue is empty"); |
| 21 | |
| 22 | mq_put(&mq, &msg); |
| 23 | assert_u_eq(mq_count(&mq), 1, "mq should contain one message"); |
| 24 | assert_ptr_eq(mq_tryget(&mq), &msg, "mq_tryget() should return msg"); |
| 25 | |
| 26 | mq_put(&mq, &msg); |
| 27 | assert_ptr_eq(mq_get(&mq), &msg, "mq_get() should return msg"); |
| 28 | |
| 29 | mq_fini(&mq); |
| 30 | } |
| 31 | TEST_END |
| 32 | |
| 33 | static void * |
| 34 | thd_receiver_start(void *arg) |
| 35 | { |
| 36 | mq_t *mq = (mq_t *)arg; |
| 37 | unsigned i; |
| 38 | |
| 39 | for (i = 0; i < (NSENDERS * NMSGS); i++) { |
| 40 | mq_msg_t *msg = mq_get(mq); |
| 41 | assert_ptr_not_null(msg, "mq_get() should never return NULL"); |
Jason Evans | 3477991 | 2013-12-13 15:07:43 -0800 | [diff] [blame] | 42 | dallocx(msg, 0); |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 43 | } |
| 44 | return (NULL); |
| 45 | } |
| 46 | |
| 47 | static void * |
| 48 | thd_sender_start(void *arg) |
| 49 | { |
| 50 | mq_t *mq = (mq_t *)arg; |
| 51 | unsigned i; |
| 52 | |
| 53 | for (i = 0; i < NMSGS; i++) { |
| 54 | mq_msg_t *msg; |
Jason Evans | 0ac396a | 2013-12-12 15:20:49 -0800 | [diff] [blame] | 55 | void *p; |
Jason Evans | 3477991 | 2013-12-13 15:07:43 -0800 | [diff] [blame] | 56 | p = mallocx(sizeof(mq_msg_t), 0); |
Jason Evans | 9790b96 | 2014-04-14 22:32:31 -0700 | [diff] [blame] | 57 | assert_ptr_not_null(p, "Unexpected mallocx() failure"); |
Jason Evans | 0ac396a | 2013-12-12 15:20:49 -0800 | [diff] [blame] | 58 | msg = (mq_msg_t *)p; |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 59 | mq_put(mq, msg); |
| 60 | } |
| 61 | return (NULL); |
| 62 | } |
| 63 | |
| 64 | TEST_BEGIN(test_mq_threaded) |
| 65 | { |
| 66 | mq_t mq; |
| 67 | thd_t receiver; |
| 68 | thd_t senders[NSENDERS]; |
| 69 | unsigned i; |
| 70 | |
| 71 | assert_false(mq_init(&mq), "Unexpected mq_init() failure"); |
| 72 | |
| 73 | thd_create(&receiver, thd_receiver_start, (void *)&mq); |
| 74 | for (i = 0; i < NSENDERS; i++) |
| 75 | thd_create(&senders[i], thd_sender_start, (void *)&mq); |
| 76 | |
| 77 | thd_join(receiver, NULL); |
| 78 | for (i = 0; i < NSENDERS; i++) |
| 79 | thd_join(senders[i], NULL); |
| 80 | |
| 81 | mq_fini(&mq); |
| 82 | } |
| 83 | TEST_END |
| 84 | |
| 85 | int |
| 86 | main(void) |
| 87 | { |
Christopher Ferris | 83e5767 | 2015-04-22 06:59:28 +0000 | [diff] [blame] | 88 | |
Jason Evans | 0f4f1ef | 2013-12-12 14:41:02 -0800 | [diff] [blame] | 89 | return (test( |
| 90 | test_mq_basic, |
| 91 | test_mq_threaded)); |
| 92 | } |
| 93 | |