]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/regression/posixsem2/semtest.c
Merge llvm-project release/17.x llvmorg-17.0.0-rc4-10-g0176e8729ea4
[FreeBSD/FreeBSD.git] / tools / regression / posixsem2 / semtest.c
1
2 #include <sys/types.h>
3 #include <sys/wait.h>
4 #include <sys/mman.h>
5 #include <semaphore.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <err.h>
9 #include <errno.h>
10 #include <fcntl.h>
11 #include <unistd.h>
12
13 #define SEM_NAME "/semtst"
14
15 int test_unnamed(void);
16 int test_named(void);
17 int test_named2(void);
18
19 int
20 test_unnamed(void)
21 {
22         sem_t *s;
23         pid_t pid;
24         int status;
25
26         printf("testing unnamed process-shared semaphore\n");
27         s = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED,
28                 -1, 0);
29         if (s == MAP_FAILED)
30                 err(1, "mmap failed");
31         if (sem_init(s, 1, 0))
32                 err(2, "sem_init failed");
33         if ((pid = fork()) == 0) {
34                 printf("child: sem_wait()\n");
35                 if (sem_wait(s))
36                         err(3, "sem_wait failed");
37                 printf("child: sem_wait() returned\n");
38                 exit(0);
39         } else {
40                 sleep(1);
41                 printf("parent: sem_post()\n");
42                 if (sem_post(s))
43                         err(4, "sem_post failed");
44                 waitpid(pid, &status, 0);
45                 if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
46                         printf("OK.\n");
47                 else
48                         printf("Failure.");
49         }
50         return (0);
51 }
52
53 int
54 test_named(void)
55 {
56         sem_t *s, *s2;
57         pid_t pid;
58         int status;
59
60         printf("testing named process-shared semaphore\n");
61         sem_unlink(SEM_NAME);
62         s = sem_open(SEM_NAME, O_CREAT, 0777, 0);
63         if (s == SEM_FAILED)
64                 err(1, "sem_open failed");
65         s2 = sem_open(SEM_NAME, O_CREAT, 0777, 0);
66         if (s2 == SEM_FAILED)
67                 err(2, "second sem_open call failed");
68         if (s != s2)
69                 errx(3,
70 "two sem_open calls for same semaphore do not return same address");
71         if (sem_close(s2))
72                 err(4, "sem_close failed");
73         if ((pid = fork()) == 0) {
74                 printf("child: sem_wait()\n");
75                 if (sem_wait(s))
76                         err(5, "sem_wait failed");
77                 printf("child: sem_wait() returned\n");
78                 exit(0);
79         } else {
80                 sleep(1);
81                 printf("parent: sem_post()\n");
82                 if (sem_post(s))
83                         err(6, "sem_post failed");
84                 waitpid(pid, &status, 0);
85                 if (WIFEXITED(status) && WEXITSTATUS(status) == 0)
86                         printf("OK.\n");
87                 else
88                         printf("Failure.");
89         }
90
91         if (sem_close(s))
92                 err(7, "sem_close failed");
93         
94         return (0);
95 }
96
97 int
98 test_named2(void)
99 {
100         sem_t *s, *s2, *s3;
101
102         printf("testing named process-shared semaphore, O_EXCL cases\n");
103         sem_unlink(SEM_NAME);
104         s = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0777, 0);
105         if (s == SEM_FAILED)
106                 err(1, "sem_open failed");
107         s2 = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0777, 0);
108         if (s2 != SEM_FAILED)
109                 errx(2, "second sem_open call wrongly succeeded");
110         if (errno != EEXIST)
111                 err(3, "second sem_open call failed with wrong errno");
112
113         s3 = sem_open(SEM_NAME, 0);
114         if (s3 == SEM_FAILED)
115                 err(4, "third sem_open call failed");
116         if (s != s3)
117                 errx(5,
118 "two sem_open calls for same semaphore do not return same address");
119         if (sem_close(s3))
120                 err(6, "sem_close failed");
121
122         if (sem_close(s))
123                 err(7, "sem_close failed");
124         
125         printf("OK.\n");
126         return (0);
127 }
128
129 int
130 main(void)
131 {
132         test_unnamed();
133         test_named();
134         test_named2();
135         return (0);
136 }