]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/ada/libgnarl/s-osinte__hpux-dce.adb
2dc5336e6610b30c06a65c885b9877f1fdad7421
[thirdparty/gcc.git] / gcc / ada / libgnarl / s-osinte__hpux-dce.adb
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
4 -- --
5 -- S Y S T E M . O S _ I N T E R F A C E --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1991-1994, Florida State University --
10 -- Copyright (C) 1995-2019, AdaCore --
11 -- --
12 -- GNAT is free software; you can redistribute it and/or modify it under --
13 -- terms of the GNU General Public License as published by the Free Soft- --
14 -- ware Foundation; either version 3, or (at your option) any later ver- --
15 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
16 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
17 -- or FITNESS FOR A PARTICULAR PURPOSE. --
18 -- --
19 -- As a special exception under Section 7 of GPL version 3, you are granted --
20 -- additional permissions described in the GCC Runtime Library Exception, --
21 -- version 3.1, as published by the Free Software Foundation. --
22 -- --
23 -- You should have received a copy of the GNU General Public License and --
24 -- a copy of the GCC Runtime Library Exception along with this program; --
25 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
26 -- <http://www.gnu.org/licenses/>. --
27 -- --
28 -- GNARL was developed by the GNARL team at Florida State University. --
29 -- Extensive contributions were provided by Ada Core Technologies, Inc. --
30 -- --
31 ------------------------------------------------------------------------------
32
33 -- This is a DCE version of this package.
34 -- Currently HP-UX and SNI use this file
35
36 pragma Polling (Off);
37 -- Turn off polling, we do not want ATC polling to take place during
38 -- tasking operations. It causes infinite loops and other problems.
39
40 -- This package encapsulates all direct interfaces to OS services
41 -- that are needed by children of System.
42
43 with Interfaces.C; use Interfaces.C;
44
45 package body System.OS_Interface is
46
47 -----------------
48 -- To_Duration --
49 -----------------
50
51 function To_Duration (TS : timespec) return Duration is
52 begin
53 return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
54 end To_Duration;
55
56 -----------------
57 -- To_Timespec --
58 -----------------
59
60 function To_Timespec (D : Duration) return timespec is
61 S : time_t;
62 F : Duration;
63
64 begin
65 S := time_t (Long_Long_Integer (D));
66 F := D - Duration (S);
67
68 -- If F has negative value due to a round-up, adjust for positive F
69 -- value.
70 if F < 0.0 then
71 S := S - 1;
72 F := F + 1.0;
73 end if;
74
75 return timespec'(tv_sec => S,
76 tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
77 end To_Timespec;
78
79 -------------------------
80 -- POSIX.1c Section 3 --
81 -------------------------
82
83 function sigwait
84 (set : access sigset_t;
85 sig : access Signal) return int
86 is
87 Result : int;
88
89 begin
90 Result := sigwait (set);
91
92 if Result = -1 then
93 sig.all := 0;
94 return errno;
95 end if;
96
97 sig.all := Signal (Result);
98 return 0;
99 end sigwait;
100
101 -- DCE_THREADS does not have pthread_kill. Instead, we just ignore it
102
103 function pthread_kill (thread : pthread_t; sig : Signal) return int is
104 pragma Unreferenced (thread, sig);
105 begin
106 return 0;
107 end pthread_kill;
108
109 --------------------------
110 -- POSIX.1c Section 11 --
111 --------------------------
112
113 -- For all following functions, DCE Threads has a non standard behavior.
114 -- It sets errno but the standard Posix requires it to be returned.
115
116 function pthread_mutexattr_init
117 (attr : access pthread_mutexattr_t) return int
118 is
119 function pthread_mutexattr_create
120 (attr : access pthread_mutexattr_t) return int;
121 pragma Import (C, pthread_mutexattr_create, "pthread_mutexattr_create");
122
123 begin
124 if pthread_mutexattr_create (attr) /= 0 then
125 return errno;
126 else
127 return 0;
128 end if;
129 end pthread_mutexattr_init;
130
131 function pthread_mutexattr_destroy
132 (attr : access pthread_mutexattr_t) return int
133 is
134 function pthread_mutexattr_delete
135 (attr : access pthread_mutexattr_t) return int;
136 pragma Import (C, pthread_mutexattr_delete, "pthread_mutexattr_delete");
137
138 begin
139 if pthread_mutexattr_delete (attr) /= 0 then
140 return errno;
141 else
142 return 0;
143 end if;
144 end pthread_mutexattr_destroy;
145
146 function pthread_mutex_init
147 (mutex : access pthread_mutex_t;
148 attr : access pthread_mutexattr_t) return int
149 is
150 function pthread_mutex_init_base
151 (mutex : access pthread_mutex_t;
152 attr : pthread_mutexattr_t) return int;
153 pragma Import (C, pthread_mutex_init_base, "pthread_mutex_init");
154
155 begin
156 if pthread_mutex_init_base (mutex, attr.all) /= 0 then
157 return errno;
158 else
159 return 0;
160 end if;
161 end pthread_mutex_init;
162
163 function pthread_mutex_destroy
164 (mutex : access pthread_mutex_t) return int
165 is
166 function pthread_mutex_destroy_base
167 (mutex : access pthread_mutex_t) return int;
168 pragma Import (C, pthread_mutex_destroy_base, "pthread_mutex_destroy");
169
170 begin
171 if pthread_mutex_destroy_base (mutex) /= 0 then
172 return errno;
173 else
174 return 0;
175 end if;
176 end pthread_mutex_destroy;
177
178 function pthread_mutex_lock
179 (mutex : access pthread_mutex_t) return int
180 is
181 function pthread_mutex_lock_base
182 (mutex : access pthread_mutex_t) return int;
183 pragma Import (C, pthread_mutex_lock_base, "pthread_mutex_lock");
184
185 begin
186 if pthread_mutex_lock_base (mutex) /= 0 then
187 return errno;
188 else
189 return 0;
190 end if;
191 end pthread_mutex_lock;
192
193 function pthread_mutex_unlock
194 (mutex : access pthread_mutex_t) return int
195 is
196 function pthread_mutex_unlock_base
197 (mutex : access pthread_mutex_t) return int;
198 pragma Import (C, pthread_mutex_unlock_base, "pthread_mutex_unlock");
199
200 begin
201 if pthread_mutex_unlock_base (mutex) /= 0 then
202 return errno;
203 else
204 return 0;
205 end if;
206 end pthread_mutex_unlock;
207
208 function pthread_condattr_init
209 (attr : access pthread_condattr_t) return int
210 is
211 function pthread_condattr_create
212 (attr : access pthread_condattr_t) return int;
213 pragma Import (C, pthread_condattr_create, "pthread_condattr_create");
214
215 begin
216 if pthread_condattr_create (attr) /= 0 then
217 return errno;
218 else
219 return 0;
220 end if;
221 end pthread_condattr_init;
222
223 function pthread_condattr_destroy
224 (attr : access pthread_condattr_t) return int
225 is
226 function pthread_condattr_delete
227 (attr : access pthread_condattr_t) return int;
228 pragma Import (C, pthread_condattr_delete, "pthread_condattr_delete");
229
230 begin
231 if pthread_condattr_delete (attr) /= 0 then
232 return errno;
233 else
234 return 0;
235 end if;
236 end pthread_condattr_destroy;
237
238 function pthread_cond_init
239 (cond : access pthread_cond_t;
240 attr : access pthread_condattr_t) return int
241 is
242 function pthread_cond_init_base
243 (cond : access pthread_cond_t;
244 attr : pthread_condattr_t) return int;
245 pragma Import (C, pthread_cond_init_base, "pthread_cond_init");
246
247 begin
248 if pthread_cond_init_base (cond, attr.all) /= 0 then
249 return errno;
250 else
251 return 0;
252 end if;
253 end pthread_cond_init;
254
255 function pthread_cond_destroy
256 (cond : access pthread_cond_t) return int
257 is
258 function pthread_cond_destroy_base
259 (cond : access pthread_cond_t) return int;
260 pragma Import (C, pthread_cond_destroy_base, "pthread_cond_destroy");
261
262 begin
263 if pthread_cond_destroy_base (cond) /= 0 then
264 return errno;
265 else
266 return 0;
267 end if;
268 end pthread_cond_destroy;
269
270 function pthread_cond_signal
271 (cond : access pthread_cond_t) return int
272 is
273 function pthread_cond_signal_base
274 (cond : access pthread_cond_t) return int;
275 pragma Import (C, pthread_cond_signal_base, "pthread_cond_signal");
276
277 begin
278 if pthread_cond_signal_base (cond) /= 0 then
279 return errno;
280 else
281 return 0;
282 end if;
283 end pthread_cond_signal;
284
285 function pthread_cond_wait
286 (cond : access pthread_cond_t;
287 mutex : access pthread_mutex_t) return int
288 is
289 function pthread_cond_wait_base
290 (cond : access pthread_cond_t;
291 mutex : access pthread_mutex_t) return int;
292 pragma Import (C, pthread_cond_wait_base, "pthread_cond_wait");
293
294 begin
295 if pthread_cond_wait_base (cond, mutex) /= 0 then
296 return errno;
297 else
298 return 0;
299 end if;
300 end pthread_cond_wait;
301
302 function pthread_cond_timedwait
303 (cond : access pthread_cond_t;
304 mutex : access pthread_mutex_t;
305 abstime : access timespec) return int
306 is
307 function pthread_cond_timedwait_base
308 (cond : access pthread_cond_t;
309 mutex : access pthread_mutex_t;
310 abstime : access timespec) return int;
311 pragma Import (C, pthread_cond_timedwait_base, "pthread_cond_timedwait");
312
313 begin
314 if pthread_cond_timedwait_base (cond, mutex, abstime) /= 0 then
315 return (if errno = EAGAIN then ETIMEDOUT else errno);
316 else
317 return 0;
318 end if;
319 end pthread_cond_timedwait;
320
321 ----------------------------
322 -- POSIX.1c Section 13 --
323 ----------------------------
324
325 function pthread_setschedparam
326 (thread : pthread_t;
327 policy : int;
328 param : access struct_sched_param) return int
329 is
330 function pthread_setscheduler
331 (thread : pthread_t;
332 policy : int;
333 priority : int) return int;
334 pragma Import (C, pthread_setscheduler, "pthread_setscheduler");
335
336 begin
337 if pthread_setscheduler (thread, policy, param.sched_priority) = -1 then
338 return errno;
339 else
340 return 0;
341 end if;
342 end pthread_setschedparam;
343
344 function sched_yield return int is
345 procedure pthread_yield;
346 pragma Import (C, pthread_yield, "pthread_yield");
347 begin
348 pthread_yield;
349 return 0;
350 end sched_yield;
351
352 -----------------------------
353 -- P1003.1c - Section 16 --
354 -----------------------------
355
356 function pthread_attr_init
357 (attributes : access pthread_attr_t) return int
358 is
359 function pthread_attr_create
360 (attributes : access pthread_attr_t) return int;
361 pragma Import (C, pthread_attr_create, "pthread_attr_create");
362
363 begin
364 if pthread_attr_create (attributes) /= 0 then
365 return errno;
366 else
367 return 0;
368 end if;
369 end pthread_attr_init;
370
371 function pthread_attr_destroy
372 (attributes : access pthread_attr_t) return int
373 is
374 function pthread_attr_delete
375 (attributes : access pthread_attr_t) return int;
376 pragma Import (C, pthread_attr_delete, "pthread_attr_delete");
377
378 begin
379 if pthread_attr_delete (attributes) /= 0 then
380 return errno;
381 else
382 return 0;
383 end if;
384 end pthread_attr_destroy;
385
386 function pthread_attr_setstacksize
387 (attr : access pthread_attr_t;
388 stacksize : size_t) return int
389 is
390 function pthread_attr_setstacksize_base
391 (attr : access pthread_attr_t;
392 stacksize : size_t) return int;
393 pragma Import (C, pthread_attr_setstacksize_base,
394 "pthread_attr_setstacksize");
395
396 begin
397 if pthread_attr_setstacksize_base (attr, stacksize) /= 0 then
398 return errno;
399 else
400 return 0;
401 end if;
402 end pthread_attr_setstacksize;
403
404 function pthread_create
405 (thread : access pthread_t;
406 attributes : access pthread_attr_t;
407 start_routine : Thread_Body;
408 arg : System.Address) return int
409 is
410 function pthread_create_base
411 (thread : access pthread_t;
412 attributes : pthread_attr_t;
413 start_routine : Thread_Body;
414 arg : System.Address) return int;
415 pragma Import (C, pthread_create_base, "pthread_create");
416
417 begin
418 if pthread_create_base
419 (thread, attributes.all, start_routine, arg) /= 0
420 then
421 return errno;
422 else
423 return 0;
424 end if;
425 end pthread_create;
426
427 --------------------------
428 -- POSIX.1c Section 17 --
429 --------------------------
430
431 function pthread_setspecific
432 (key : pthread_key_t;
433 value : System.Address) return int
434 is
435 function pthread_setspecific_base
436 (key : pthread_key_t;
437 value : System.Address) return int;
438 pragma Import (C, pthread_setspecific_base, "pthread_setspecific");
439
440 begin
441 if pthread_setspecific_base (key, value) /= 0 then
442 return errno;
443 else
444 return 0;
445 end if;
446 end pthread_setspecific;
447
448 function pthread_getspecific (key : pthread_key_t) return System.Address is
449 function pthread_getspecific_base
450 (key : pthread_key_t;
451 value : access System.Address) return int;
452 pragma Import (C, pthread_getspecific_base, "pthread_getspecific");
453 Addr : aliased System.Address;
454
455 begin
456 if pthread_getspecific_base (key, Addr'Access) /= 0 then
457 return System.Null_Address;
458 else
459 return Addr;
460 end if;
461 end pthread_getspecific;
462
463 function pthread_key_create
464 (key : access pthread_key_t;
465 destructor : destructor_pointer) return int
466 is
467 function pthread_keycreate
468 (key : access pthread_key_t;
469 destructor : destructor_pointer) return int;
470 pragma Import (C, pthread_keycreate, "pthread_keycreate");
471
472 begin
473 if pthread_keycreate (key, destructor) /= 0 then
474 return errno;
475 else
476 return 0;
477 end if;
478 end pthread_key_create;
479
480 function Get_Stack_Base (thread : pthread_t) return Address is
481 pragma Warnings (Off, thread);
482 begin
483 return Null_Address;
484 end Get_Stack_Base;
485
486 procedure pthread_init is
487 begin
488 null;
489 end pthread_init;
490
491 function intr_attach (sig : int; handler : isr_address) return long is
492 function c_signal (sig : int; handler : isr_address) return long;
493 pragma Import (C, c_signal, "signal");
494 begin
495 return c_signal (sig, handler);
496 end intr_attach;
497
498 end System.OS_Interface;