mc_translate.c: enable further uses of DLexpensive for scalar EQ/NE comparisons
[valgrind.git] / none / tests / sem.c
blobb293d5c6e5939d49862353a6d50c462a80cd7e65
1 #define _GNU_SOURCE
3 #include <config.h>
4 #include <errno.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <sys/ipc.h>
8 #include <sys/sem.h>
9 #include <time.h>
10 #include <unistd.h>
12 void semctl_test (int trace, const char *fname)
14 key_t key;
15 int semid;
16 int nr_of_readers;
17 int ret;
19 union semun {
20 int val; /* Value for SETVAL */
21 struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
22 unsigned short *array; /* Array for GETALL, SETALL */
23 struct seminfo *__buf; /* Buffer for IPC_INFO
24 (Linux-specific) */
25 } u;
27 struct semid_ds ds;
29 key = ftok (fname, 1);
30 if (key == -1)
31 perror ("ftok");
32 nr_of_readers = 4;
34 semid = semget (key, 2 * nr_of_readers, IPC_CREAT + 0660);
35 if (semid == -1) {
36 perror ("semget");
38 if (trace)
39 printf("semid %d\n", semid);
41 u.buf = &ds;
42 ret = semctl (semid, 0, IPC_STAT, u);
43 if (ret == -1)
44 perror("semctl IPC_STAT");
45 if (trace)
46 printf("semid %d sem_nsems %d\n", semid, (int) ds.sem_nsems);
49 unsigned short semarray[2 * nr_of_readers];
50 for (int count = 0; count < nr_of_readers; count++) {
51 semarray[2 * count] = 0;
52 semarray[2 * count + 1] = 1000;
54 ret = semctl (semid, 0, SETALL, semarray);
55 if (ret == -1)
56 perror ("semctl SETALL");
59 ret = semctl (semid, 0, IPC_RMID);
60 if (ret == -1)
61 perror ("semctl IPC_RMID");
64 int main(int argc, char **argv)
66 int semid;
67 struct sembuf sop;
68 #ifdef HAVE_SEMTIMEDOP
69 struct timespec ts;
70 #endif
72 if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0)
74 perror("semget");
75 exit(1);
78 sop.sem_num = 0;
79 sop.sem_op = 1;
80 sop.sem_flg = 0;
82 if (semop(semid, &sop, 1) < 0)
84 perror("semop");
85 semctl(semid, 0, IPC_RMID);
86 exit(1);
89 if (semctl(semid, 0, GETVAL) != 1)
91 perror("semctl GETVAL");
92 semctl(semid, 0, IPC_RMID);
93 exit(1);
96 if (semctl(semid, 0, GETPID) != getpid())
98 perror("semctl GETPID");
99 semctl(semid, 0, IPC_RMID);
100 exit(1);
103 /* The next call to semtimedop causes the program to hang on
104 ppc32-linux (Yellow Dog 4.0). I don't know why. Hence the
105 extended ifdef. */
106 #if defined(HAVE_SEMTIMEDOP) && !defined(__powerpc__)
107 sop.sem_num = 0;
108 sop.sem_op = 0;
109 sop.sem_flg = 0;
111 ts.tv_sec = 0;
112 ts.tv_nsec = 1000000;
114 if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN)
116 perror("semtimedop");
117 semctl(semid, 0, IPC_RMID);
118 exit(1);
120 #endif
122 sop.sem_num = 0;
123 sop.sem_op = -1;
124 sop.sem_flg = 0;
126 if (semop(semid, &sop, 1) < 0)
128 perror("semop");
129 semctl(semid, 0, IPC_RMID);
130 exit(1);
133 #ifdef HAVE_SEMTIMEDOP
134 sop.sem_num = 0;
135 sop.sem_op = 0;
136 sop.sem_flg = 0;
138 ts.tv_sec = 0;
139 ts.tv_nsec = 1000;
141 if (semtimedop(semid, &sop, 1, &ts) < 0)
143 perror("semtimedop");
144 semctl(semid, 0, IPC_RMID);
145 exit(1);
147 #endif
149 if (semctl(semid, 0, IPC_RMID) < 0)
151 perror("semctl(IPC_RMID)");
152 exit(1);
155 semctl_test(argc > 1, argv[0]);
156 exit(0);