Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/regress/lib Regression test for p1003.1b semaphores as found...
details: https://anonhg.NetBSD.org/src/rev/c364fe0b9321
branches: trunk
changeset: 542237:c364fe0b9321
user: thorpej <thorpej%NetBSD.org@localhost>
date: Fri Jan 24 01:56:47 2003 +0000
description:
Regression test for p1003.1b semaphores as found in librt.
diffstat:
regress/lib/Makefile | 4 +-
regress/lib/librt/Makefile | 5 +
regress/lib/librt/sem/Makefile | 13 +++
regress/lib/librt/sem/sem.c | 176 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 196 insertions(+), 2 deletions(-)
diffs (220 lines):
diff -r c94b23b13dd8 -r c364fe0b9321 regress/lib/Makefile
--- a/regress/lib/Makefile Fri Jan 24 01:54:52 2003 +0000
+++ b/regress/lib/Makefile Fri Jan 24 01:56:47 2003 +0000
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.12 2003/01/20 20:12:17 christos Exp $
+# $NetBSD: Makefile,v 1.13 2003/01/24 01:56:47 thorpej Exp $
.include <bsd.own.mk>
-SUBDIR+= csu libc libposix libpthread libutil
+SUBDIR+= csu libc libposix libpthread librt libutil
.if (${MKSKEY} != "no")
SUBDIR+= libskey
diff -r c94b23b13dd8 -r c364fe0b9321 regress/lib/librt/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/lib/librt/Makefile Fri Jan 24 01:56:47 2003 +0000
@@ -0,0 +1,5 @@
+# $NetBSD: Makefile,v 1.1 2003/01/24 01:56:47 thorpej Exp $
+
+SUBDIR+= sem
+
+.include <bsd.subdir.mk>
diff -r c94b23b13dd8 -r c364fe0b9321 regress/lib/librt/sem/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/lib/librt/sem/Makefile Fri Jan 24 01:56:47 2003 +0000
@@ -0,0 +1,13 @@
+# $NetBSD: Makefile,v 1.1 2003/01/24 01:56:48 thorpej Exp $
+
+WARNS?=1
+NOMAN= # defined
+
+PROG= sem
+LDADD+= -lrt
+
+regress:
+ @echo Testing POSIX 1003.1b semaphores
+ ./sem
+
+.include <bsd.prog.mk>
diff -r c94b23b13dd8 -r c364fe0b9321 regress/lib/librt/sem/sem.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/regress/lib/librt/sem/sem.c Fri Jan 24 01:56:47 2003 +0000
@@ -0,0 +1,176 @@
+/* $NetBSD: sem.c,v 1.1 2003/01/24 01:56:48 thorpej Exp $ */
+
+/*
+ * Copyright (C) 2000 Jason Evans <jasone%freebsd.org@localhost>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice(s), this list of conditions and the following disclaimer as
+ * the first lines of this file unmodified other than the possible
+ * addition of one or more copyright notices.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice(s), this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/wait.h>
+#include <assert.h>
+#include <stdio.h>
+#include <err.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <semaphore.h>
+#include <unistd.h>
+
+#define NCHILDREN 10
+
+static void
+child(sem_t *sem)
+{
+
+#ifdef DEBUG
+ printf("PID %d waiting for semaphore...\n", getpid());
+#endif
+ if (sem_wait(sem))
+ err(1, "sem_wait");
+#ifdef DEBUG
+ printf("PID %d got semaphore\n", getpid());
+#endif
+}
+
+static sem_t *
+create_sem(const char *name)
+{
+ sem_t *sem;
+
+ (void)sem_unlink(name);
+ sem = sem_open(name, O_CREAT | O_EXCL, 0644, 0);
+ assert(sem != SEM_FAILED);
+
+ return (sem);
+}
+
+static void
+delete_sem(sem_t *sem, const char *name)
+{
+
+ assert(0 == sem_close(sem));
+ assert(0 == sem_unlink(name));
+}
+
+static void
+dosem(void)
+{
+ sem_t *sem_a, *sem_b;
+ pid_t children[NCHILDREN];
+ unsigned i;
+ int val, status;
+ pid_t pid;
+
+ sem_b = create_sem("/sem_b");
+ assert(0 == sem_getvalue(sem_b, &val));
+ assert(0 == val);
+
+ assert(0 == sem_post(sem_b));
+ assert(0 == sem_getvalue(sem_b, &val));
+ assert(1 == val);
+
+ assert(0 == sem_wait(sem_b));
+ assert(-1 == sem_trywait(sem_b));
+ assert(EAGAIN == errno);
+ assert(0 == sem_post(sem_b));
+ assert(0 == sem_trywait(sem_b));
+ assert(0 == sem_post(sem_b));
+ assert(0 == sem_wait(sem_b));
+ assert(0 == sem_post(sem_b));
+
+ delete_sem(sem_b, "/sem_b");
+
+ sem_a = create_sem("/sem_a");
+
+ for (i = 0; i < NCHILDREN; i++) {
+ switch ((pid = fork())) {
+ case -1:
+ abort();
+ case 0:
+ child(sem_a);
+ _exit(0);
+ default:
+ children[i] = pid;
+ break;
+ }
+ }
+
+ for (i = 0; i < NCHILDREN; i++) {
+ sleep(1);
+#ifdef DEBUG
+ printf("main loop 1: posting...\n");
+#endif
+ assert(0 == sem_post(sem_a));
+ }
+
+ for (i = 0; i < NCHILDREN; i++) {
+ assert(children[i] == waitpid(children[i], &status, 0));
+ assert(WIFEXITED(status));
+ assert(0 == WEXITSTATUS(status));
+ }
+
+ for (i = 0; i < NCHILDREN; i++) {
+ switch ((pid = fork())) {
+ case -1:
+ abort();
+ case 0:
+ child(sem_a);
+ _exit(0);
+ default:
+ children[i] = pid;
+ break;
+ }
+ }
+
+ for (i = 0; i < NCHILDREN; i++) {
+ sleep(1);
+#ifdef DEBUG
+ printf("main loop 2: posting...\n");
+#endif
+ assert(0 == sem_post(sem_a));
+ }
+
+ for (i = 0; i < NCHILDREN; i++) {
+ assert(children[i] == waitpid(children[i], &status, 0));
+ assert(WIFEXITED(status));
+ assert(0 == WEXITSTATUS(status));
+ }
+
+ delete_sem(sem_a, "/sem_a");
+}
+
+int
+main(int argc, char *argv[])
+{
+#ifdef DEBUG
+ printf("Test begin\n");
+#endif
+ dosem();
+
+#ifdef DEBUG
+ printf("Test end\n");
+#endif
+ return 0;
+}
Home |
Main Index |
Thread Index |
Old Index