Home | History | Annotate | Line # | Download | only in unit
      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 	expect_false(mq_init(&mq), "Unexpected mq_init() failure");
     17 	expect_u_eq(mq_count(&mq), 0, "mq should be empty");
     18 	expect_ptr_null(mq_tryget(&mq),
     19 	    "mq_tryget() should fail when the queue is empty");
     20 
     21 	mq_put(&mq, &msg);
     22 	expect_u_eq(mq_count(&mq), 1, "mq should contain one message");
     23 	expect_ptr_eq(mq_tryget(&mq), &msg, "mq_tryget() should return msg");
     24 
     25 	mq_put(&mq, &msg);
     26 	expect_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 		expect_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 		expect_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 	expect_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