0022627: Change OCCT memory management defaults
[occt.git] / src / OSD / OSD_Csemaphore.c
1 #ifndef WNT
2
3 #ifdef HAVE_CONFIG_H
4 # include <config.h>
5 #endif
6
7 #include <errno.h>
8 #include <stdio.h>
9
10 #ifdef HAVE_SYS_TYPES_H
11 # include <sys/types.h>
12 #endif
13
14 #ifdef HAVE_SYS_IPC_H
15 #include <sys/ipc.h>
16 #endif
17
18 #ifdef HAVE_SYS_SEM_H
19 # include <sys/sem.h>
20 #endif
21
22 #ifdef HAVE_SIGNAL_H
23 # include <signal.h>
24 #endif
25
26 #ifdef HAVE_UNISTD_H
27 # include <unistd.h>
28 #endif
29
30 /* Modified by Stephan GARNAUD (ARM) 1992 for Matra Datavision */
31
32 #if (!defined (__hpux)) && (!defined (HPUX))
33
34 #define CLUSTER_NUMBER 4 
35 #define SIGUSER SIGUSR1-1
36
37 static struct sembuf event_flag ;
38          
39 static void osd_signal_(int); 
40 int osd_getkey(char *);
41 #ifdef ANSI
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 (*)());
51
52 #endif
53
54 static void
55 osd_signal_(int i )
56 {
57 }
58
59
60 int
61 create_semaphore(char *name) 
62 /*=======================================================
63
64         CREATE a semaphore cluster of 32 events
65
66 =========================================================*/
67 {
68 int status ;
69
70
71
72     key_t key;
73
74
75         key = (key_t) osd_getkey (name);
76
77
78         status = semget(key,CLUSTER_NUMBER,0750 + IPC_CREAT) ;
79
80         if( status < 0 ) return (0) ;  /* semget failed */
81         return status ;
82 }
83
84
85 int
86 open_semaphore(char *name)
87 /*=========================================================
88
89         OPEN a semaphore cluster 
90
91 =========================================================================*/
92 {
93 int status ;
94
95
96     key_t key;
97
98
99         key = (key_t) osd_getkey (name);
100         status = semget(key,0,0) ;
101
102         if( status < 0 ) return (0) ;  /* semget failed */
103          else   return status;
104 }
105
106
107
108 int
109 lock_semaphore(int *semid, int *event) 
110 /*==================================================
111
112         WAIT & LOCK the semaphore attached to the cluster
113
114 ====================================================*/
115 {
116   int status ;
117
118   event_flag.sem_num = *event ;
119   event_flag.sem_op  = -1 ;
120   event_flag.sem_flg = SEM_UNDO;
121   
122   do 
123 #if defined(SEMOP_NO_REFERENCE) && !defined(DECOSF1) 
124     status = semop(*semid,event_flag,1) ;
125 #else 
126     status = semop(*semid,&event_flag,1) ;
127 #endif
128   while ( status < 0 && errno != EINTR );
129   
130   if( status < 0 )
131     return (0) ;
132   else
133     return (1) ;
134 }
135
136
137 int
138 free_semaphore(int *semid, int *event) 
139 /*==================================================
140
141         FREE the semaphore attached to the cluster
142
143 ====================================================*/
144 {
145   int status ;
146   int zero_value = 0;
147   
148   event_flag.sem_num = *event ;
149   event_flag.sem_op  = 1 ;
150   event_flag.sem_flg = IPC_NOWAIT ;
151
152 #ifdef SEMCTL_NO_REFERENCE
153   status = semctl(*semid,*event,GETVAL,zero_value);
154 #else 
155   status = semctl(*semid,*event,GETVAL,&zero_value);
156 #endif
157   if (status !=1) 
158 #if defined(SEMOP_NO_REFERENCE) && !defined(DECOSF1)
159     status = semop(*semid,event_flag,1) ;
160 #else 
161     status = semop(*semid,&event_flag,1) ;
162 #endif
163   else return 0;
164
165    if( status < 0 )
166     return (0) ;
167   else
168     return (1) ;
169 }
170
171
172
173 int
174 reset_semaphore(int *semid, int *event) 
175 /*===================================================
176
177       RESET semaphore to initial state
178
179 ======================================================*/
180 {
181  int status;
182  int zero_value=0;
183
184 #ifdef SEMCTL_NO_REFERENCE
185  status = semctl(*semid,*event,SETVAL,zero_value);
186 #else
187  status = semctl(*semid,*event,SETVAL,&zero_value);
188 #endif
189  if (status < 0) return(0);
190             else return(1);
191
192 }
193
194
195 int
196 set_semaphore(int *semid, int *event, int value) 
197 /*=================================================
198
199       SET semaphore counter to a fixed value
200
201 ====================================================*/
202 {
203  int status;
204
205 #ifdef SEMCTL_NO_REFERENCE
206  status = semctl((*semid),*event,SETVAL,value);
207 #else
208  status = semctl((*semid),*event,SETVAL,&value);
209 #endif
210  if (status < 0) return(0);
211             else return(1);
212
213 }
214
215
216 int
217 get_semaphore(int *semid, int *event, int *value)
218 /*=================================================
219  
220       GET semaphore counter value
221  
222 ==========================================================================*/
223 {
224  int status;
225  
226 #ifdef SEMCTL_NO_REFERENCE
227  status = semctl((*semid),*event,GETVAL,value);
228 #else
229  status = semctl((*semid),*event,GETVAL,&value);
230 #endif
231
232  if (status < 0) return(0);
233             else return(1);
234  
235 }
236
237
238
239 int
240 remove_semaphore(int *semid, char *name) 
241 /*======================================================
242
243           CLOSE semaphore attached to cluster
244
245 =============================================================================*/
246 {
247  int status;
248
249 /*  status = semctl(*semid,IPC_RMID,NULL);*/
250   status = semctl(*semid,IPC_RMID,0);
251   if (status < 0) return 0;
252              else return 1;
253
254 }
255
256
257 int
258 osd_signl_(int *event) 
259 /*====================================================
260
261         ARM the SIGNAL event (Must be 1 or 2 )
262         And WAIT after it was KILLED
263
264 =======================================================*/
265 {
266         signal(SIGUSER + *event ,  osd_signal_) ;
267         pause() ;
268         return (1) ;
269 }
270
271 int
272 osd_skill_(int *pid, int *event) 
273 /*==================================================
274
275         SEND a SIGNAL to the PROCESS ID specified
276
277  ====================================================*/
278 {
279        if( kill( *pid , SIGUSER  + *event ) < 0 ) return (0) ;
280        return (1) ;
281 }
282
283 int
284 osd_alarm_(int sec,RETSIGTYPE (*_alarm)())
285 /*====================================================
286
287         ARM the SIGNAL event (Must be 1 or 2 )
288         And WAIT after it was KILLED
289        
290 ==========================================================================*/
291 {
292   signal(SIGALRM, _alarm) ;
293   alarm(sec) ;
294   return (1) ;
295 }
296
297 #endif /* __hpux  */
298
299 #endif /* WNT  */