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;
+}