#include "test/jemalloc_test.h"

#define	NSENDERS	3
#define	NMSGS		100000

typedef struct mq_msg_s mq_msg_t;
struct mq_msg_s {
	mq_msg(mq_msg_t)	link;
};
mq_gen(static, mq_, mq_t, mq_msg_t, link)

TEST_BEGIN(test_mq_basic)
{
	mq_t mq;
	mq_msg_t msg;

	assert_false(mq_init(&mq), "Unexpected mq_init() failure");
	assert_u_eq(mq_count(&mq), 0, "mq should be empty");
	assert_ptr_null(mq_tryget(&mq),
	    "mq_tryget() should fail when the queue is empty");

	mq_put(&mq, &msg);
	assert_u_eq(mq_count(&mq), 1, "mq should contain one message");
	assert_ptr_eq(mq_tryget(&mq), &msg, "mq_tryget() should return msg");

	mq_put(&mq, &msg);
	assert_ptr_eq(mq_get(&mq), &msg, "mq_get() should return msg");

	mq_fini(&mq);
}
TEST_END

static void *
thd_receiver_start(void *arg)
{
	mq_t *mq = (mq_t *)arg;
	unsigned i;

	for (i = 0; i < (NSENDERS * NMSGS); i++) {
		mq_msg_t *msg = mq_get(mq);
		assert_ptr_not_null(msg, "mq_get() should never return NULL");
		dallocx(msg, 0);
	}
	return (NULL);
}

static void *
thd_sender_start(void *arg)
{
	mq_t *mq = (mq_t *)arg;
	unsigned i;

	for (i = 0; i < NMSGS; i++) {
		mq_msg_t *msg;
		void *p;
		p = mallocx(sizeof(mq_msg_t), 0);
		assert_ptr_not_null(p, "Unexpected mallocx() failure");
		msg = (mq_msg_t *)p;
		mq_put(mq, msg);
	}
	return (NULL);
}

TEST_BEGIN(test_mq_threaded)
{
	mq_t mq;
	thd_t receiver;
	thd_t senders[NSENDERS];
	unsigned i;

	assert_false(mq_init(&mq), "Unexpected mq_init() failure");

	thd_create(&receiver, thd_receiver_start, (void *)&mq);
	for (i = 0; i < NSENDERS; i++)
		thd_create(&senders[i], thd_sender_start, (void *)&mq);

	thd_join(receiver, NULL);
	for (i = 0; i < NSENDERS; i++)
		thd_join(senders[i], NULL);

	mq_fini(&mq);
}
TEST_END

int
main(void)
{

	return (test(
	    test_mq_basic,
	    test_mq_threaded));
}

