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 mq_t mq; 14 mq_msg_t msg; 15 16 assert_false(mq_init(&mq), "Unexpected mq_init() failure"); 17 assert_u_eq(mq_count(&mq), 0, "mq should be empty"); 18 assert_ptr_null(mq_tryget(&mq), 19 "mq_tryget() should fail when the queue is empty"); 20 21 mq_put(&mq, &msg); 22 assert_u_eq(mq_count(&mq), 1, "mq should contain one message"); 23 assert_ptr_eq(mq_tryget(&mq), &msg, "mq_tryget() should return msg"); 24 25 mq_put(&mq, &msg); 26 assert_ptr_eq(mq_get(&mq), &msg, "mq_get() should return msg"); 27 28 mq_fini(&mq); 29 } 30 TEST_END 31 32 static void * 33 thd_receiver_start(void *arg) { 34 mq_t *mq = (mq_t *)arg; 35 unsigned i; 36 37 for (i = 0; i < (NSENDERS * NMSGS); i++) { 38 mq_msg_t *msg = mq_get(mq); 39 assert_ptr_not_null(msg, "mq_get() should never return NULL"); 40 dallocx(msg, 0); 41 } 42 return NULL; 43 } 44 45 static void * 46 thd_sender_start(void *arg) { 47 mq_t *mq = (mq_t *)arg; 48 unsigned i; 49 50 for (i = 0; i < NMSGS; i++) { 51 mq_msg_t *msg; 52 void *p; 53 p = mallocx(sizeof(mq_msg_t), 0); 54 assert_ptr_not_null(p, "Unexpected mallocx() failure"); 55 msg = (mq_msg_t *)p; 56 mq_put(mq, msg); 57 } 58 return NULL; 59 } 60 61 TEST_BEGIN(test_mq_threaded) { 62 mq_t mq; 63 thd_t receiver; 64 thd_t senders[NSENDERS]; 65 unsigned i; 66 67 assert_false(mq_init(&mq), "Unexpected mq_init() failure"); 68 69 thd_create(&receiver, thd_receiver_start, (void *)&mq); 70 for (i = 0; i < NSENDERS; i++) { 71 thd_create(&senders[i], thd_sender_start, (void *)&mq); 72 } 73 74 thd_join(receiver, NULL); 75 for (i = 0; i < NSENDERS; i++) { 76 thd_join(senders[i], NULL); 77 } 78 79 mq_fini(&mq); 80 } 81 TEST_END 82 83 int 84 main(void) { 85 return test( 86 test_mq_basic, 87 test_mq_threaded); 88 } 89 90