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