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