semtest.c revision 201715
1139825Simp/* $FreeBSD: head/tools/regression/posixsem2/semtest.c 201715 2010-01-07 04:15:49Z davidxu $ */
299657Sbenno
378342Sbenno#include <sys/types.h>
478342Sbenno#include <sys/wait.h>
578342Sbenno#include <sys/mman.h>
678342Sbenno#include <semaphore.h>
778342Sbenno#include <stdio.h>
878342Sbenno#include <stdlib.h>
999657Sbenno#include <err.h>
1099657Sbenno#include <fcntl.h>
1199657Sbenno#include <unistd.h>
1299657Sbenno
1378342Sbenno#define SEM_NAME "/semtst"
1499657Sbenno
1599657Sbennoint test_unnamed(void);
1699657Sbennoint test_named(void);
1799657Sbenno
1899657Sbennoint
1999657Sbennotest_unnamed(void)
2099657Sbenno{
2199657Sbenno	sem_t *s;
2299657Sbenno	pid_t pid;
2399657Sbenno	int status;
2499657Sbenno
2578342Sbenno	printf("testing unnamed process-shared semaphore\n");
2678342Sbenno	s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED,
27209812Snwhitehorn		-1, 0);
28209812Snwhitehorn	if (s == MAP_FAILED)
29209812Snwhitehorn		err(1, "mmap failed");
30209812Snwhitehorn	if (sem_init(s, 1, 0))
31113038Sobrien		err(2, "sem_init failed");
32113038Sobrien	if ((pid = fork()) == 0) {
3378342Sbenno		printf("child: sem_wait()\n");
3499657Sbenno		if (sem_wait(s))
3599657Sbenno			err(3, "sem_wait failed");
3699657Sbenno		printf("child: sem_wait() returned\n");
3799657Sbenno		exit(0);
3899657Sbenno	} else {
39209812Snwhitehorn		sleep(1);
40209812Snwhitehorn		printf("parent: sem_post()\n");
4199657Sbenno		if (sem_post(s))
4299657Sbenno			err(4, "sem_post failed");
43246713Skib		waitpid(pid, &status, 0);
4499657Sbenno		if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
45246713Skib			printf("OK.\n");
46108939Sgrehan		else
4799657Sbenno			printf("Failure.");
4899657Sbenno	}
49239008Sjhb	return (0);
50239008Sjhb}
5199657Sbenno
52108939Sgrehanint
5399657Sbennotest_named(void)
54112436Smux{
5599657Sbenno	sem_t *s, *s2;
56229967Snwhitehorn	pid_t pid;
57209812Snwhitehorn	int status;
5899657Sbenno
59216154Snwhitehorn	printf("testing named process-shared semaphore\n");
60209812Snwhitehorn	sem_unlink(SEM_NAME);
61216154Snwhitehorn	s = sem_open(SEM_NAME, O_CREAT, 0777, 0);
62216154Snwhitehorn	if (s == SEM_FAILED)
63209812Snwhitehorn		err(1, "sem_open failed");
64209812Snwhitehorn	s2 = sem_open(SEM_NAME, O_CREAT, 0777, 0);
6599657Sbenno	if (s2 == SEM_FAILED)
66209812Snwhitehorn		err(2, "second sem_open call failed");
67209812Snwhitehorn	if (s != s2)
68232356Sjhb		err(3, "two sem_open calls for same semaphore do not returm same address.");
69209812Snwhitehorn	if (sem_close(s2))
70209812Snwhitehorn		err(4, "sem_close failed");
7199657Sbenno	if ((pid = fork()) == 0) {
72209812Snwhitehorn		printf("child: sem_wait()\n");
73209812Snwhitehorn		if (sem_wait(s))
74209812Snwhitehorn			err(5, "sem_wait failed");
75209812Snwhitehorn		printf("child: sem_wait() returned\n");
76209812Snwhitehorn		exit(0);
77209812Snwhitehorn	} else {
78209812Snwhitehorn		sleep(1);
79117126Sscottl		printf("parent: sem_post()\n");
80117126Sscottl		if (sem_post(s))
81209812Snwhitehorn			err(6, "sem_post failed");
82216154Snwhitehorn		waitpid(pid, &status, 0);
83216154Snwhitehorn		if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
8499657Sbenno			printf("OK.\n");
8599657Sbenno		else
86209812Snwhitehorn			printf("Failure.");
87209812Snwhitehorn	}
88209812Snwhitehorn
89209812Snwhitehorn	if (sem_close(s))
90246713Skib		err(7, "sem_close failed");
91209812Snwhitehorn
92209812Snwhitehorn	return (0);
93209812Snwhitehorn}
94209812Snwhitehorn
95209812Snwhitehornint
96209812Snwhitehornmain(void)
97209812Snwhitehorn{
98209812Snwhitehorn	test_unnamed();
99209812Snwhitehorn	test_named();
100209812Snwhitehorn	return (0);
101209812Snwhitehorn}
102209812Snwhitehorn