summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2010-01-05 12:34:13 +0000
committerdavidxu <davidxu@FreeBSD.org>2010-01-05 12:34:13 +0000
commit1053aec712f82111677117dba7b24e0db2fa257e (patch)
tree8f26a3db71b1ebccaa9fe705cf5fb22c3996db7a /tools
parent543315e6a463b5abdfa16d156b4ad8978297ed36 (diff)
downloadFreeBSD-src-1053aec712f82111677117dba7b24e0db2fa257e.zip
FreeBSD-src-1053aec712f82111677117dba7b24e0db2fa257e.tar.gz
Add test code for POSIX semaphore implementation.
Diffstat (limited to 'tools')
-rw-r--r--tools/regression/posixsem2/Makefile9
-rw-r--r--tools/regression/posixsem2/semtest.c101
2 files changed, 110 insertions, 0 deletions
diff --git a/tools/regression/posixsem2/Makefile b/tools/regression/posixsem2/Makefile
new file mode 100644
index 0000000..84f9617
--- /dev/null
+++ b/tools/regression/posixsem2/Makefile
@@ -0,0 +1,9 @@
+# $FreeBSD$
+
+PROG= semtest
+SRCS= semtest.c
+NO_MAN=
+
+WARNS?= 3
+
+.include <bsd.prog.mk>
diff --git a/tools/regression/posixsem2/semtest.c b/tools/regression/posixsem2/semtest.c
new file mode 100644
index 0000000..7557a61
--- /dev/null
+++ b/tools/regression/posixsem2/semtest.c
@@ -0,0 +1,101 @@
+/* $FreeBSD$ */
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/mman.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <err.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#define SEM_NAME "/semtst"
+
+int test_unnamed(void);
+int test_named(void);
+
+int
+test_unnamed(void)
+{
+ sem_t *s;
+ pid_t pid;
+ int status;
+
+ printf("testing unnamed process-shared semaphore\n");
+ s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED,
+ -1, 0);
+ if (s == MAP_FAILED)
+ err(1, "mmap failed");
+ if (sem_init(s, 1, 0))
+ err(2, "sem_init failed");
+ if ((pid = fork()) == 0) {
+ printf("child: sem_wait()\n");
+ if (sem_wait(s))
+ err(3, "sem_wait failed");
+ printf("child: sem_wait() returned\n");
+ exit(0);
+ } else {
+ sleep(1);
+ printf("parent: sem_post()\n");
+ if (sem_post(s))
+ err(4, "sem_post failed");
+ waitpid(pid, &status, 0);
+ if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
+ printf("OK.\n");
+ else
+ printf("Failure.");
+ }
+ return (0);
+}
+
+int
+test_named(void)
+{
+ sem_t *s, *s2;
+ pid_t pid;
+ int status;
+
+ printf("testing named process-shared semaphore\n");
+ sem_unlink(SEM_NAME);
+ s = sem_open(SEM_NAME, O_CREAT, 0777);
+ if (s == SEM_FAILED)
+ err(1, "sem_open failed");
+ s2 = sem_open(SEM_NAME, O_CREAT, 0777);
+ if (s2 == SEM_FAILED)
+ err(2, "second sem_open call failed");
+ if (s != s2)
+ err(3, "two sem_open calls for same semaphore do not returm same address.");
+ if (sem_close(s2))
+ err(4, "sem_close failed");
+ if ((pid = fork()) == 0) {
+ printf("child: sem_wait()\n");
+ if (sem_wait(s))
+ err(5, "sem_wait failed");
+ printf("child: sem_wait() returned\n");
+ exit(0);
+ } else {
+ sleep(1);
+ printf("parent: sem_post()\n");
+ if (sem_post(s))
+ err(6, "sem_post failed");
+ waitpid(pid, &status, 0);
+ if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
+ printf("OK.\n");
+ else
+ printf("Failure.");
+ }
+
+ if (sem_close(s))
+ err(7, "sem_close failed");
+
+ return (0);
+}
+
+int
+main(void)
+{
+ test_unnamed();
+ test_named();
+ return (0);
+}
OpenPOWER on IntegriCloud