10 #ifdef HAVE_SYS_TYPES_H
11 # include <sys/types.h>
30 /* Modified by Stephan GARNAUD (ARM) 1992 for Matra Datavision */
32 #if (!defined (__hpux)) && (!defined (HPUX))
34 #define CLUSTER_NUMBER 4
35 #define SIGUSER SIGUSR1-1
37 static struct sembuf event_flag ;
39 static void osd_signal_(int);
40 int osd_getkey(char *);
42 int create_semaphore(char *);
43 int open_semaphore(char *);
44 int lock_semaphore(int *,int *);
45 int free_semaphore(int *,int *);
46 int reset_semaphore(int *,int *);
47 int remove_semaphore(int *,char *);
48 int osd_signl_(int *);
49 int osd_skill_(int *,int *);
50 int osd_alarm_(int,void (*)());
61 create_semaphore(char *name)
62 /*=======================================================
64 CREATE a semaphore cluster of 32 events
66 =========================================================*/
75 key = (key_t) osd_getkey (name);
78 status = semget(key,CLUSTER_NUMBER,0750 + IPC_CREAT) ;
80 if( status < 0 ) return (0) ; /* semget failed */
86 open_semaphore(char *name)
87 /*=========================================================
89 OPEN a semaphore cluster
91 =========================================================================*/
99 key = (key_t) osd_getkey (name);
100 status = semget(key,0,0) ;
102 if( status < 0 ) return (0) ; /* semget failed */
109 lock_semaphore(int *semid, int *event)
110 /*==================================================
112 WAIT & LOCK the semaphore attached to the cluster
114 ====================================================*/
118 event_flag.sem_num = *event ;
119 event_flag.sem_op = -1 ;
120 event_flag.sem_flg = SEM_UNDO;
123 #if defined(SEMOP_NO_REFERENCE) && !defined(DECOSF1)
124 status = semop(*semid,event_flag,1) ;
126 status = semop(*semid,&event_flag,1) ;
128 while ( status < 0 && errno != EINTR );
138 free_semaphore(int *semid, int *event)
139 /*==================================================
141 FREE the semaphore attached to the cluster
143 ====================================================*/
148 event_flag.sem_num = *event ;
149 event_flag.sem_op = 1 ;
150 event_flag.sem_flg = IPC_NOWAIT ;
152 #ifdef SEMCTL_NO_REFERENCE
153 status = semctl(*semid,*event,GETVAL,zero_value);
155 status = semctl(*semid,*event,GETVAL,&zero_value);
158 #if defined(SEMOP_NO_REFERENCE) && !defined(DECOSF1)
159 status = semop(*semid,event_flag,1) ;
161 status = semop(*semid,&event_flag,1) ;
174 reset_semaphore(int *semid, int *event)
175 /*===================================================
177 RESET semaphore to initial state
179 ======================================================*/
184 #ifdef SEMCTL_NO_REFERENCE
185 status = semctl(*semid,*event,SETVAL,zero_value);
187 status = semctl(*semid,*event,SETVAL,&zero_value);
189 if (status < 0) return(0);
196 set_semaphore(int *semid, int *event, int value)
197 /*=================================================
199 SET semaphore counter to a fixed value
201 ====================================================*/
205 #ifdef SEMCTL_NO_REFERENCE
206 status = semctl((*semid),*event,SETVAL,value);
208 status = semctl((*semid),*event,SETVAL,&value);
210 if (status < 0) return(0);
217 get_semaphore(int *semid, int *event, int *value)
218 /*=================================================
220 GET semaphore counter value
222 ==========================================================================*/
226 #ifdef SEMCTL_NO_REFERENCE
227 status = semctl((*semid),*event,GETVAL,value);
229 status = semctl((*semid),*event,GETVAL,&value);
232 if (status < 0) return(0);
240 remove_semaphore(int *semid, char *name)
241 /*======================================================
243 CLOSE semaphore attached to cluster
245 =============================================================================*/
249 /* status = semctl(*semid,IPC_RMID,NULL);*/
250 status = semctl(*semid,IPC_RMID,0);
251 if (status < 0) return 0;
258 osd_signl_(int *event)
259 /*====================================================
261 ARM the SIGNAL event (Must be 1 or 2 )
262 And WAIT after it was KILLED
264 =======================================================*/
266 signal(SIGUSER + *event , osd_signal_) ;
272 osd_skill_(int *pid, int *event)
273 /*==================================================
275 SEND a SIGNAL to the PROCESS ID specified
277 ====================================================*/
279 if( kill( *pid , SIGUSER + *event ) < 0 ) return (0) ;
284 osd_alarm_(int sec,RETSIGTYPE (*_alarm)())
285 /*====================================================
287 ARM the SIGNAL event (Must be 1 or 2 )
288 And WAIT after it was KILLED
290 ==========================================================================*/
292 signal(SIGALRM, _alarm) ;