FreeBSD: try to make eventfd2 testcase deterministic
[valgrind.git] / memcheck / tests / freebsd / eventfd2.c
blobd620907c9da35068a93565747bb1ec027d8324ac
1 /* EFD_SEMAPHORE */
3 #include <sys/eventfd.h>
4 #include <sys/wait.h>
5 #include <inttypes.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <unistd.h>
10 static void xsem_wait(int fd)
12 eventfd_t cntr;
14 if (eventfd_read(fd, &cntr) != 0) {
15 perror("reading eventfd");
16 exit(1);
19 fprintf(stdout, "wait completed on %d: count=%" PRIu64 "\n",
20 fd, cntr);
21 fflush(stdout);
24 static void xsem_post(int fd, int count)
26 eventfd_t cntr = count;
28 if (eventfd_write(fd, cntr) != 0) {
29 perror("writing eventfd");
30 exit(1);
34 static void sem_player(int fd1, int fd2)
36 /* these printfs did contain the pid
37 * so "[%u] ... ", getpid()
38 * not good for regresson tests
39 * (also xsem_wait above)
41 fprintf(stdout, "posting 1 on %d\n", fd1);
42 fflush(stdout);
43 xsem_post(fd1, 1);
45 fprintf(stdout, "waiting on %d\n", fd2);
46 fflush(stdout);
47 xsem_wait(fd2);
49 fprintf(stdout, "posting 1 on %d\n", fd1);
50 fflush(stdout);
51 xsem_post(fd1, 1);
53 fprintf(stdout, "waiting on %d\n", fd2);
54 fflush(stdout);
55 xsem_wait(fd2);
57 fprintf(stdout, "posting 5 on %d\n", fd1);
58 fflush(stdout);
59 xsem_post(fd1, 5);
61 fprintf(stdout, "waiting 5 times on %d\n", fd2);
62 fflush(stdout);
63 xsem_wait(fd2);
64 xsem_wait(fd2);
65 xsem_wait(fd2);
66 xsem_wait(fd2);
67 xsem_wait(fd2);
70 static void usage(char const *prg)
72 fprintf(stderr, "use: %s [-h]\n", prg);
75 int main(int argc, char **argv)
77 int c, fd1, fd2, status;
78 pid_t cpid_poster, cpid_waiter;
80 while ((c = getopt(argc, argv, "h")) != -1) {
82 switch (c) {
83 default:
84 usage(argv[0]);
85 return 1;
89 if ((fd1 = eventfd(0, EFD_SEMAPHORE)) == -1 ||
90 (fd2 = eventfd(0, EFD_SEMAPHORE)) == -1) {
91 perror("eventfd");
92 return 1;
94 if ((cpid_poster = fork()) == 0) {
95 sem_player(fd1, fd2);
96 exit(0);
98 sleep(1);
99 if ((cpid_waiter = fork()) == 0) {
100 sem_player(fd2, fd1);
101 exit(0);
103 waitpid(cpid_poster, &status, 0);
104 waitpid(cpid_waiter, &status, 0);
106 exit(0);