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