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

Reply via email to