Module Name: src Committed By: rmind Date: Mon Jul 13 02:55:42 UTC 2009
Added Files: src/regress/sys/kern/mqueue: Makefile mq_prio_test.c Log Message: Regression test for POSIX message queue priority handling. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/regress/sys/kern/mqueue/Makefile \ src/regress/sys/kern/mqueue/mq_prio_test.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Added files: Index: src/regress/sys/kern/mqueue/Makefile diff -u /dev/null src/regress/sys/kern/mqueue/Makefile:1.1 --- /dev/null Mon Jul 13 02:55:42 2009 +++ src/regress/sys/kern/mqueue/Makefile Mon Jul 13 02:55:42 2009 @@ -0,0 +1,16 @@ +# $NetBSD: Makefile,v 1.1 2009/07/13 02:55:42 rmind Exp $ +# +PROG= mq_prio_test +NOMAN= # defined +WARNS= 4 +LDADD= -lrt + +regress: + @/sbin/sysctl kern.mqueue.mq_prio_max=33 + @if ./$(PROG); then \ + echo "PASSED"; \ + else \ + echo "FAILED"; \ + fi + +.include <bsd.prog.mk> Index: src/regress/sys/kern/mqueue/mq_prio_test.c diff -u /dev/null src/regress/sys/kern/mqueue/mq_prio_test.c:1.1 --- /dev/null Mon Jul 13 02:55:42 2009 +++ src/regress/sys/kern/mqueue/mq_prio_test.c Mon Jul 13 02:55:42 2009 @@ -0,0 +1,104 @@ +/* $NetBSD: mq_prio_test.c,v 1.1 2009/07/13 02:55:42 rmind Exp $ */ + +/* + * Test for POSIX message queue priority handling. + * + * This file is in the Public Domain. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <err.h> + +#include <mqueue.h> +#include <assert.h> + +#define MQUEUE "/mq_prio_test" +#define MQ_PRIO_BOUNDARY 31 + +static void +send_msgs(mqd_t mqfd) +{ + char msg[2]; + + msg[1] = '\0'; + + msg[0] = 'a'; + if (mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BOUNDARY) == -1) + err(EXIT_FAILURE, "mq_send 1"); + + msg[0] = 'b'; + if (mq_send(mqfd, msg, sizeof(msg), 1 + MQ_PRIO_BOUNDARY) == -1) + err(EXIT_FAILURE, "mq_send 2"); + + msg[0] = 'c'; + if (mq_send(mqfd, msg, sizeof(msg), MQ_PRIO_BOUNDARY) == -1) + err(EXIT_FAILURE, "mq_send 3"); + + msg[0] = 'd'; + if (mq_send(mqfd, msg, sizeof(msg), 1 + MQ_PRIO_BOUNDARY) == -1) + err(EXIT_FAILURE, "mq_send 4"); +} + +static void +receive_msgs(mqd_t mqfd) +{ + struct mq_attr mqa; + char *m; + unsigned p; + int len; + + if (mq_getattr(mqfd, &mqa) == -1) { + err(EXIT_FAILURE, "mq_getattr"); + } + len = mqa.mq_msgsize; + m = calloc(1, len); + if (m == NULL) { + err(EXIT_FAILURE, "calloc"); + } + + if (mq_receive(mqfd, m, len, &p) == -1) { + err(EXIT_FAILURE, "mq_receive 1"); + } + assert(p == 32 && m[0] == 'b'); + + if (mq_receive(mqfd, m, len, &p) == -1) { + err(EXIT_FAILURE, "mq_receive 2"); + } + assert(p == 32 && m[0] == 'd'); + + if (mq_receive(mqfd, m, len, &p) == -1) { + err(EXIT_FAILURE, "mq_receive 3"); + } + assert(p == 31 && m[0] == 'a'); + + if (mq_receive(mqfd, m, len, &p) == -1) { + err(EXIT_FAILURE, "mq_receive 4"); + } + assert(p == 31 && m[0] == 'c'); + + free(m); +} + +int +main(int argc, char **argv) +{ + mqd_t mqfd; + + (void)mq_unlink(MQUEUE); + + mqfd = mq_open(MQUEUE, O_RDWR | O_CREAT, + S_IRUSR | S_IRWXG | S_IROTH, NULL); + if (mqfd == -1) + err(EXIT_FAILURE, "mq_open"); + + send_msgs(mqfd); + receive_msgs(mqfd); + + mq_close(mqfd); + + if (mq_unlink(MQUEUE) == -1) + err(EXIT_FAILURE, "mq_unlink"); + + return 0; +}