thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 1 | #define _GNU_SOURCE |
| 2 | |
thughes | 2c52e7d | 2004-06-14 13:15:40 +0000 | [diff] [blame] | 3 | #include <config.h> |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 4 | #include <errno.h> |
| 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> |
| 7 | #include <sys/ipc.h> |
| 8 | #include <sys/sem.h> |
sewardj | 2f3bcd2 | 2006-12-12 01:38:15 +0000 | [diff] [blame] | 9 | #include <time.h> |
philippe | 5d2db15 | 2012-10-21 18:46:09 +0000 | [diff] [blame] | 10 | #include <unistd.h> |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 11 | int main(int argc, char **argv) |
| 12 | { |
| 13 | int semid; |
| 14 | struct sembuf sop; |
thughes | b2d43ba | 2004-06-14 17:27:41 +0000 | [diff] [blame] | 15 | #ifdef HAVE_SEMTIMEDOP |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 16 | struct timespec ts; |
thughes | b2d43ba | 2004-06-14 17:27:41 +0000 | [diff] [blame] | 17 | #endif |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 18 | |
| 19 | if ((semid = semget(IPC_PRIVATE, 1, 0600)) < 0) |
| 20 | { |
| 21 | perror("semget"); |
| 22 | exit(1); |
| 23 | } |
| 24 | |
| 25 | sop.sem_num = 0; |
| 26 | sop.sem_op = 1; |
| 27 | sop.sem_flg = 0; |
| 28 | |
| 29 | if (semop(semid, &sop, 1) < 0) |
| 30 | { |
| 31 | perror("semop"); |
| 32 | semctl(semid, 0, IPC_RMID); |
| 33 | exit(1); |
| 34 | } |
| 35 | |
philippe | 5d2db15 | 2012-10-21 18:46:09 +0000 | [diff] [blame] | 36 | if (semctl(semid, 0, GETVAL) != 1) |
| 37 | { |
| 38 | perror("semctl GETVAL"); |
| 39 | semctl(semid, 0, IPC_RMID); |
| 40 | exit(1); |
| 41 | } |
| 42 | |
| 43 | if (semctl(semid, 0, GETPID) != getpid()) |
| 44 | { |
| 45 | perror("semctl GETPID"); |
| 46 | semctl(semid, 0, IPC_RMID); |
| 47 | exit(1); |
| 48 | } |
| 49 | |
sewardj | d9a1ce1 | 2005-07-02 20:11:59 +0000 | [diff] [blame] | 50 | /* The next call to semtimedop causes the program to hang on |
| 51 | ppc32-linux (Yellow Dog 4.0). I don't know why. Hence the |
| 52 | extended ifdef. */ |
| 53 | #if defined(HAVE_SEMTIMEDOP) && !defined(__powerpc__) |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 54 | sop.sem_num = 0; |
| 55 | sop.sem_op = 0; |
| 56 | sop.sem_flg = 0; |
| 57 | |
| 58 | ts.tv_sec = 0; |
thughes | b2d43ba | 2004-06-14 17:27:41 +0000 | [diff] [blame] | 59 | ts.tv_nsec = 1000000; |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 60 | |
| 61 | if (semtimedop(semid, &sop, 1, &ts) < 0 && errno != EAGAIN) |
| 62 | { |
| 63 | perror("semtimedop"); |
| 64 | semctl(semid, 0, IPC_RMID); |
| 65 | exit(1); |
| 66 | } |
thughes | b2d43ba | 2004-06-14 17:27:41 +0000 | [diff] [blame] | 67 | #endif |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 68 | |
| 69 | sop.sem_num = 0; |
| 70 | sop.sem_op = -1; |
| 71 | sop.sem_flg = 0; |
| 72 | |
| 73 | if (semop(semid, &sop, 1) < 0) |
| 74 | { |
| 75 | perror("semop"); |
| 76 | semctl(semid, 0, IPC_RMID); |
| 77 | exit(1); |
| 78 | } |
| 79 | |
thughes | b2d43ba | 2004-06-14 17:27:41 +0000 | [diff] [blame] | 80 | #ifdef HAVE_SEMTIMEDOP |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 81 | sop.sem_num = 0; |
| 82 | sop.sem_op = 0; |
| 83 | sop.sem_flg = 0; |
| 84 | |
| 85 | ts.tv_sec = 0; |
| 86 | ts.tv_nsec = 1000; |
| 87 | |
| 88 | if (semtimedop(semid, &sop, 1, &ts) < 0) |
| 89 | { |
| 90 | perror("semtimedop"); |
| 91 | semctl(semid, 0, IPC_RMID); |
| 92 | exit(1); |
| 93 | } |
thughes | b2d43ba | 2004-06-14 17:27:41 +0000 | [diff] [blame] | 94 | #endif |
thughes | 0376628 | 2004-06-13 14:23:00 +0000 | [diff] [blame] | 95 | |
| 96 | if (semctl(semid, 0, IPC_RMID) < 0) |
| 97 | { |
| 98 | perror("semctl(IPC_RMID)"); |
| 99 | exit(1); |
| 100 | } |
| 101 | |
| 102 | exit(0); |
| 103 | } |