Add proper per-file copyright notices/licenses and top-level license.
[bluesky.git] / TBBT / trace_play / sem.c
1 #include <sys/sem.h>
2 #include <sys/types.h>
3 #include <errno.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 extern int errno;
10
11 #define SEMPERM 0777
12 #define TRUE 1
13 #define FALSE 0
14
15 #define MAX_SEM 50
16 struct {
17     int semid;
18     char name[256];
19 } semname[MAX_SEM] =
20 {
21 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
22 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
23 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
24 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
25 /*
26 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
27 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
28 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
29 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
30 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""},
31 */
32 {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}, {0, ""}
33 } ;
34
35
36 /* semaphore operations */
37
38 int initsem(key_t key, int value)           /* create a semaphore */
39 {
40   int status = 0;
41   int semid;
42
43   if ((semid = semget(key, 1, SEMPERM|IPC_CREAT|IPC_EXCL)) == -1) {
44        if (errno == EEXIST) {
45                 printf("semget key %d already exist\n", key);
46             semid = semget(key, 1, 0);
47            }
48   } else {
49        status = semctl(semid, 0, SETVAL, value);
50         }
51
52   if (semid == -1 || status == -1) {
53            printf("%d:\n", getpid());
54        perror("initsem() failed");
55        return (-1);
56   } else
57        return semid;
58 }
59
60 //int getsem(key_t key, int setval)           /* create a semaphore */
61 int getsem(key_t key)           /* create a semaphore */
62 {
63   int status = 0;
64   int semid;
65
66   semid = semget(key, 1, 0);
67
68   if (semid == -1 || status == -1) {
69            printf("%d:\n", getpid());
70        perror("initsem() failed");
71        return (-1);
72   } else
73        return semid;
74 }
75
76 int waitsem(int semid)           /* wait on a semaphore */
77 {
78   struct sembuf p_buf;
79 #ifdef NO_SEM
80   return;
81 #endif
82
83   p_buf.sem_num = 0;
84   p_buf.sem_op = -1;
85   p_buf.sem_flg = SEM_UNDO;
86
87   if (semop(semid, &p_buf, 1) == -1) {
88         printf("%d:", getpid());
89        perror("waitsem() failed");
90        exit(1);
91   } else
92        return (0);
93 }
94
95 int postsem(int semid)           /* post to a semaphore */
96 {
97   struct sembuf v_buf;
98
99 #ifdef NO_SEM
100   return;
101 #endif
102
103
104   v_buf.sem_num = 0;
105   v_buf.sem_op = 1;
106   v_buf.sem_flg = SEM_UNDO;
107
108   if (semop(semid, &v_buf, 1) == -1) {
109         printf("%d:", getpid());
110        perror("postsem() failed");
111        exit(1);
112   } else
113        return (0);
114 }
115
116 void destsem(int semid)          /* destroy a semaphore */
117 {
118   semctl(semid, 0, IPC_RMID, 0);
119 }
120
121 int dest_and_init_sem (key_t key, int value, char * name)
122 {
123     int semid;
124     int i;
125     semid = getsem (key);
126     if (semid!=-1)
127         destsem (semid);
128     semid = initsem (key, value);
129     printf ("%s semid %d for key %d value %d \n", name, semid, key, value);
130                                                                                 
131     if (semid == 0) {
132         printf ("semid == 0\n");
133         exit(0);
134     }
135                                                                                 
136     for (i=0; i<MAX_SEM; i++) {
137         if (semname[i].semid == 0) {
138             semname[i].semid = semid;
139             strcpy(semname[i].name, name);
140             break;
141         }
142     }
143                                                                                 
144     if (i==MAX_SEM) {
145         printf ("semname full\n");
146         exit (-1);
147     }
148                                                                                 
149     return semid;
150 }
151
152