blob: bb42f2b6611947916e65530cf0735cc2913f7ff3 [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
int main(void) {
mqd_t mq_a;
mqd_t mq_b;
struct mq_attr mq_attr;
struct mq_attr mq_attr_test;
char msg[] = "Hello";
char buffer[1024] = { 0 }; /* 'C' fills in the rest of the array with 0s. */
unsigned prio;
struct timespec expiry;
mq_attr.mq_flags = 0;
mq_attr.mq_maxmsg = 10;
mq_attr.mq_msgsize = 1024;
mq_attr.mq_curmsgs = 0;
char mq_name[100];
snprintf(mq_name, 100, "/rr-test-queue%d", sys_gettid());
mq_a = mq_open(mq_name, O_WRONLY | O_CREAT, 0777, &mq_attr);
test_assert(mq_a != -1);
mq_b = mq_open(mq_name, O_RDONLY);
test_assert(mq_b != -1);
test_assert(mq_getattr(mq_a, &mq_attr_test) == 0);
test_assert(mq_attr_test.mq_flags == mq_attr.mq_flags);
test_assert(mq_attr_test.mq_maxmsg == mq_attr.mq_maxmsg);
test_assert(mq_attr_test.mq_msgsize == mq_attr.mq_msgsize);
test_assert(mq_attr_test.mq_curmsgs == 0);
test_assert(mq_getattr(mq_b, &mq_attr_test) == 0);
test_assert(mq_attr_test.mq_flags == mq_attr.mq_flags);
test_assert(mq_attr_test.mq_maxmsg == mq_attr.mq_maxmsg);
test_assert(mq_attr_test.mq_msgsize == mq_attr.mq_msgsize);
test_assert(mq_attr_test.mq_curmsgs == 0);
test_assert(sizeof(msg) == 6);
test_assert(mq_send(mq_a, msg, sizeof(msg), 100) == 0);
test_assert(mq_getattr(mq_b, &mq_attr_test) == 0);
test_assert(mq_attr_test.mq_curmsgs == 1);
prio = ~0;
test_assert(mq_receive(mq_b, buffer, sizeof(buffer), &prio) == sizeof(msg));
test_assert(memcmp(msg, buffer, sizeof(msg)) == 0);
test_assert(prio == 100);
clock_gettime(CLOCK_REALTIME, &expiry);
expiry.tv_sec += 2;
test_assert(mq_timedreceive(mq_b, buffer, sizeof(buffer), &prio, &expiry) ==
-1);
mq_unlink(mq_name);
atomic_puts("EXIT-SUCCESS");
return 0;
}