]>
Commit | Line | Data |
---|---|---|
c470d7c9 AC |
1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3084fecd | 3 | -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- |
c470d7c9 AC |
4 | -- -- |
5 | -- S Y S T E M . O S _ I N T E R F A C E -- | |
6 | -- -- | |
7 | -- S p e c -- | |
8 | -- -- | |
cfc29a96 | 9 | -- Copyright (C) 1991-2017, Florida State University -- |
4b490c1e | 10 | -- Copyright (C) 1995-2020, Free Software Foundation, Inc. -- |
c470d7c9 | 11 | -- -- |
607d0635 | 12 | -- GNAT is free software; you can redistribute it and/or modify it under -- |
c470d7c9 | 13 | -- terms of the GNU General Public License as published by the Free Soft- -- |
607d0635 AC |
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- -- | |
c470d7c9 | 16 | -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- |
607d0635 AC |
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/>. -- | |
c470d7c9 AC |
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 | ||
b11e8d6f | 33 | -- This is Darwin pthreads version of this package |
c470d7c9 | 34 | |
b11e8d6f | 35 | -- This package includes all direct interfaces to OS services that are needed |
366b8af7 | 36 | -- by the tasking run-time (libgnarl). |
c470d7c9 | 37 | |
b11e8d6f RD |
38 | -- PLEASE DO NOT add any with-clauses to this package or remove the pragma |
39 | -- Elaborate_Body. It is designed to be a bottom-level (leaf) package. | |
c470d7c9 AC |
40 | |
41 | with Interfaces.C; | |
59f3dd0a | 42 | with System.OS_Constants; |
366b8af7 | 43 | |
c470d7c9 AC |
44 | package System.OS_Interface is |
45 | pragma Preelaborate; | |
46 | ||
47 | subtype int is Interfaces.C.int; | |
48 | subtype short is Interfaces.C.short; | |
49 | subtype long is Interfaces.C.long; | |
50 | subtype unsigned is Interfaces.C.unsigned; | |
51 | subtype unsigned_short is Interfaces.C.unsigned_short; | |
52 | subtype unsigned_long is Interfaces.C.unsigned_long; | |
53 | subtype unsigned_char is Interfaces.C.unsigned_char; | |
54 | subtype plain_char is Interfaces.C.plain_char; | |
55 | subtype size_t is Interfaces.C.size_t; | |
56 | ||
57 | ----------- | |
58 | -- Errno -- | |
59 | ----------- | |
60 | ||
61 | function errno return int; | |
62 | pragma Import (C, errno, "__get_errno"); | |
63 | ||
64 | EINTR : constant := 4; | |
65 | ENOMEM : constant := 12; | |
66 | EINVAL : constant := 22; | |
67 | EAGAIN : constant := 35; | |
68 | ETIMEDOUT : constant := 60; | |
69 | ||
70 | ------------- | |
71 | -- Signals -- | |
72 | ------------- | |
73 | ||
74 | Max_Interrupt : constant := 31; | |
75 | type Signal is new int range 0 .. Max_Interrupt; | |
76 | for Signal'Size use int'Size; | |
77 | ||
78 | SIGHUP : constant := 1; -- hangup | |
79 | SIGINT : constant := 2; -- interrupt (rubout) | |
80 | SIGQUIT : constant := 3; -- quit (ASCD FS) | |
81 | SIGILL : constant := 4; -- illegal instruction (not reset) | |
82 | SIGTRAP : constant := 5; -- trace trap (not reset) | |
83 | SIGIOT : constant := 6; -- IOT instruction | |
84 | SIGABRT : constant := 6; -- used by abort, replace SIGIOT in the future | |
85 | SIGEMT : constant := 7; -- EMT instruction | |
86 | SIGFPE : constant := 8; -- floating point exception | |
87 | SIGKILL : constant := 9; -- kill (cannot be caught or ignored) | |
88 | SIGBUS : constant := 10; -- bus error | |
89 | SIGSEGV : constant := 11; -- segmentation violation | |
90 | SIGSYS : constant := 12; -- bad argument to system call | |
91 | SIGPIPE : constant := 13; -- write on a pipe with no one to read it | |
92 | SIGALRM : constant := 14; -- alarm clock | |
93 | SIGTERM : constant := 15; -- software termination signal from kill | |
94 | SIGURG : constant := 16; -- urgent condition on IO channel | |
95 | SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) | |
96 | SIGTSTP : constant := 18; -- user stop requested from tty | |
97 | SIGCONT : constant := 19; -- stopped process has been continued | |
98 | SIGCHLD : constant := 20; -- child status change | |
99 | SIGTTIN : constant := 21; -- background tty read attempted | |
100 | SIGTTOU : constant := 22; -- background tty write attempted | |
101 | SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) | |
102 | SIGXCPU : constant := 24; -- CPU time limit exceeded | |
103 | SIGXFSZ : constant := 25; -- filesize limit exceeded | |
104 | SIGVTALRM : constant := 26; -- virtual timer expired | |
105 | SIGPROF : constant := 27; -- profiling timer expired | |
106 | SIGWINCH : constant := 28; -- window size change | |
107 | SIGINFO : constant := 29; -- information request | |
108 | SIGUSR1 : constant := 30; -- user defined signal 1 | |
109 | SIGUSR2 : constant := 31; -- user defined signal 2 | |
110 | ||
a3068ca6 | 111 | SIGADAABORT : constant := SIGABRT; |
c470d7c9 AC |
112 | -- Change this if you want to use another signal for task abort. |
113 | -- SIGTERM might be a good one. | |
114 | ||
115 | type Signal_Set is array (Natural range <>) of Signal; | |
116 | ||
b11e8d6f | 117 | Unmasked : constant Signal_Set := |
e8e028cb | 118 | (SIGTTIN, SIGTTOU, SIGSTOP, SIGTSTP); |
c470d7c9 | 119 | |
b11e8d6f | 120 | Reserved : constant Signal_Set := |
e8e028cb AC |
121 | (SIGKILL, SIGSTOP); |
122 | ||
123 | Exception_Signals : constant Signal_Set := | |
124 | (SIGFPE, SIGILL, SIGSEGV, SIGBUS); | |
125 | -- These signals (when runtime or system) will be caught and converted | |
126 | -- into an Ada exception. | |
c470d7c9 AC |
127 | |
128 | type sigset_t is private; | |
129 | ||
130 | function sigaddset (set : access sigset_t; sig : Signal) return int; | |
131 | pragma Import (C, sigaddset, "sigaddset"); | |
132 | ||
133 | function sigdelset (set : access sigset_t; sig : Signal) return int; | |
134 | pragma Import (C, sigdelset, "sigdelset"); | |
135 | ||
136 | function sigfillset (set : access sigset_t) return int; | |
137 | pragma Import (C, sigfillset, "sigfillset"); | |
138 | ||
139 | function sigismember (set : access sigset_t; sig : Signal) return int; | |
140 | pragma Import (C, sigismember, "sigismember"); | |
141 | ||
142 | function sigemptyset (set : access sigset_t) return int; | |
143 | pragma Import (C, sigemptyset, "sigemptyset"); | |
144 | ||
145 | type siginfo_t is private; | |
146 | type ucontext_t is private; | |
147 | ||
148 | type Signal_Handler is access procedure | |
149 | (signo : Signal; | |
150 | info : access siginfo_t; | |
151 | context : access ucontext_t); | |
152 | ||
153 | type struct_sigaction is record | |
154 | sa_handler : System.Address; | |
155 | sa_mask : sigset_t; | |
156 | sa_flags : int; | |
157 | end record; | |
158 | pragma Convention (C, struct_sigaction); | |
159 | type struct_sigaction_ptr is access all struct_sigaction; | |
160 | ||
161 | SIG_BLOCK : constant := 1; | |
162 | SIG_UNBLOCK : constant := 2; | |
163 | SIG_SETMASK : constant := 3; | |
164 | ||
165 | SIG_DFL : constant := 0; | |
166 | SIG_IGN : constant := 1; | |
167 | ||
168 | SA_SIGINFO : constant := 16#0040#; | |
770db697 | 169 | SA_ONSTACK : constant := 16#0001#; |
c470d7c9 AC |
170 | |
171 | function sigaction | |
172 | (sig : Signal; | |
173 | act : struct_sigaction_ptr; | |
174 | oact : struct_sigaction_ptr) return int; | |
175 | pragma Import (C, sigaction, "sigaction"); | |
176 | ||
177 | ---------- | |
178 | -- Time -- | |
179 | ---------- | |
180 | ||
181 | Time_Slice_Supported : constant Boolean := True; | |
276e95ca | 182 | -- Indicates whether time slicing is supported |
c470d7c9 AC |
183 | |
184 | type timespec is private; | |
185 | ||
c269a1f5 | 186 | type clockid_t is new int; |
c470d7c9 AC |
187 | |
188 | function clock_gettime | |
189 | (clock_id : clockid_t; | |
190 | tp : access timespec) return int; | |
191 | ||
ed09416f AC |
192 | function clock_getres |
193 | (clock_id : clockid_t; | |
194 | res : access timespec) return int; | |
195 | ||
c470d7c9 AC |
196 | function To_Duration (TS : timespec) return Duration; |
197 | pragma Inline (To_Duration); | |
198 | ||
199 | function To_Timespec (D : Duration) return timespec; | |
200 | pragma Inline (To_Timespec); | |
201 | ||
c470d7c9 AC |
202 | ------------------------- |
203 | -- Priority Scheduling -- | |
204 | ------------------------- | |
205 | ||
206 | SCHED_OTHER : constant := 1; | |
207 | SCHED_RR : constant := 2; | |
208 | SCHED_FIFO : constant := 4; | |
209 | ||
ec946d18 AC |
210 | function To_Target_Priority |
211 | (Prio : System.Any_Priority) return Interfaces.C.int; | |
b11e8d6f | 212 | -- Maps System.Any_Priority to a POSIX priority |
ec946d18 | 213 | |
c470d7c9 AC |
214 | ------------- |
215 | -- Process -- | |
216 | ------------- | |
217 | ||
218 | type pid_t is private; | |
219 | ||
220 | function kill (pid : pid_t; sig : Signal) return int; | |
221 | pragma Import (C, kill, "kill"); | |
222 | ||
223 | function getpid return pid_t; | |
224 | pragma Import (C, getpid, "getpid"); | |
225 | ||
226 | --------- | |
227 | -- LWP -- | |
228 | --------- | |
229 | ||
230 | function lwp_self return System.Address; | |
009c0268 | 231 | pragma Import (C, lwp_self, "__gnat_lwp_self"); |
b3520ca0 AC |
232 | -- Return the mach thread bound to the current thread. The value is not |
233 | -- used by the run-time library but made available to debuggers. | |
c470d7c9 AC |
234 | |
235 | ------------- | |
236 | -- Threads -- | |
237 | ------------- | |
238 | ||
239 | type Thread_Body is access | |
240 | function (arg : System.Address) return System.Address; | |
def46b54 RD |
241 | pragma Convention (C, Thread_Body); |
242 | ||
c470d7c9 AC |
243 | type pthread_t is private; |
244 | subtype Thread_Id is pthread_t; | |
245 | ||
246 | type pthread_mutex_t is limited private; | |
247 | type pthread_cond_t is limited private; | |
248 | type pthread_attr_t is limited private; | |
249 | type pthread_mutexattr_t is limited private; | |
250 | type pthread_condattr_t is limited private; | |
251 | type pthread_key_t is private; | |
252 | ||
253 | type pthread_mutex_ptr is access all pthread_mutex_t; | |
254 | type pthread_cond_ptr is access all pthread_cond_t; | |
255 | ||
256 | PTHREAD_CREATE_DETACHED : constant := 2; | |
257 | ||
c5173b1a AC |
258 | PTHREAD_SCOPE_PROCESS : constant := 2; |
259 | PTHREAD_SCOPE_SYSTEM : constant := 1; | |
260 | ||
6f5add73 AC |
261 | -- Read/Write lock not supported on Darwin. To add support both types |
262 | -- pthread_rwlock_t and pthread_rwlockattr_t must properly be defined | |
263 | -- with the associated routines pthread_rwlock_[init/destroy] and | |
264 | -- pthread_rwlock_[rdlock/wrlock/unlock]. | |
265 | ||
266 | subtype pthread_rwlock_t is pthread_mutex_t; | |
267 | subtype pthread_rwlockattr_t is pthread_mutexattr_t; | |
268 | ||
c470d7c9 AC |
269 | ----------- |
270 | -- Stack -- | |
271 | ----------- | |
272 | ||
770db697 EB |
273 | type stack_t is record |
274 | ss_sp : System.Address; | |
275 | ss_size : size_t; | |
276 | ss_flags : int; | |
277 | end record; | |
278 | pragma Convention (C, stack_t); | |
279 | ||
280 | function sigaltstack | |
281 | (ss : not null access stack_t; | |
282 | oss : access stack_t) return int; | |
283 | pragma Import (C, sigaltstack, "sigaltstack"); | |
284 | ||
285 | Alternate_Stack : aliased System.Address; | |
b61ebe4f AC |
286 | pragma Import (C, Alternate_Stack, "__gnat_alternate_stack"); |
287 | -- The alternate signal stack for stack overflows | |
770db697 | 288 | |
deef4289 | 289 | Alternate_Stack_Size : constant := 32 * 1024; |
b61ebe4f | 290 | -- This must be in keeping with init.c:__gnat_alternate_stack |
770db697 | 291 | |
c470d7c9 | 292 | Stack_Base_Available : constant Boolean := False; |
276e95ca RW |
293 | -- Indicates whether the stack base is available on this target. This |
294 | -- allows us to share s-osinte.adb between all the FSU run time. Note that | |
295 | -- this value can only be true if pthread_t has a complete definition that | |
770db697 | 296 | -- corresponds exactly to the C header files. |
c470d7c9 AC |
297 | |
298 | function Get_Stack_Base (thread : pthread_t) return System.Address; | |
299 | pragma Inline (Get_Stack_Base); | |
770db697 EB |
300 | -- returns the stack base of the specified thread. Only call this function |
301 | -- when Stack_Base_Available is True. | |
c470d7c9 | 302 | |
b204e984 | 303 | function Get_Page_Size return int; |
c470d7c9 | 304 | pragma Import (C, Get_Page_Size, "getpagesize"); |
6a2afd13 | 305 | -- Returns the size of a page |
c470d7c9 AC |
306 | |
307 | PROT_NONE : constant := 0; | |
308 | PROT_READ : constant := 1; | |
309 | PROT_WRITE : constant := 2; | |
310 | PROT_EXEC : constant := 4; | |
311 | PROT_ALL : constant := PROT_READ + PROT_WRITE + PROT_EXEC; | |
312 | ||
313 | PROT_ON : constant := PROT_NONE; | |
314 | PROT_OFF : constant := PROT_ALL; | |
315 | ||
770db697 EB |
316 | function mprotect |
317 | (addr : System.Address; | |
318 | len : size_t; | |
319 | prot : int) return int; | |
c470d7c9 AC |
320 | pragma Import (C, mprotect); |
321 | ||
322 | --------------------------------------- | |
323 | -- Nonstandard Thread Initialization -- | |
324 | --------------------------------------- | |
325 | ||
326 | procedure pthread_init; | |
327 | ||
328 | ------------------------- | |
329 | -- POSIX.1c Section 3 -- | |
330 | ------------------------- | |
331 | ||
332 | function sigwait (set : access sigset_t; sig : access Signal) return int; | |
333 | pragma Import (C, sigwait, "sigwait"); | |
334 | ||
335 | function pthread_kill (thread : pthread_t; sig : Signal) return int; | |
336 | pragma Import (C, pthread_kill, "pthread_kill"); | |
337 | ||
c470d7c9 AC |
338 | function pthread_sigmask |
339 | (how : int; | |
1dd5ad55 AC |
340 | set : access sigset_t; |
341 | oset : access sigset_t) return int; | |
0fe6afd3 | 342 | pragma Import (C, pthread_sigmask, "pthread_sigmask"); |
c470d7c9 AC |
343 | |
344 | -------------------------- | |
345 | -- POSIX.1c Section 11 -- | |
346 | -------------------------- | |
347 | ||
348 | function pthread_mutexattr_init | |
349 | (attr : access pthread_mutexattr_t) return int; | |
350 | pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); | |
351 | ||
352 | function pthread_mutexattr_destroy | |
353 | (attr : access pthread_mutexattr_t) return int; | |
354 | pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); | |
355 | ||
356 | function pthread_mutex_init | |
357 | (mutex : access pthread_mutex_t; | |
358 | attr : access pthread_mutexattr_t) return int; | |
359 | pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); | |
360 | ||
361 | function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int; | |
362 | pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); | |
363 | ||
364 | function pthread_mutex_lock (mutex : access pthread_mutex_t) return int; | |
365 | pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); | |
366 | ||
367 | function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int; | |
368 | pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); | |
369 | ||
370 | function pthread_condattr_init | |
371 | (attr : access pthread_condattr_t) return int; | |
372 | pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); | |
373 | ||
374 | function pthread_condattr_destroy | |
375 | (attr : access pthread_condattr_t) return int; | |
376 | pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); | |
377 | ||
378 | function pthread_cond_init | |
379 | (cond : access pthread_cond_t; | |
380 | attr : access pthread_condattr_t) return int; | |
381 | pragma Import (C, pthread_cond_init, "pthread_cond_init"); | |
382 | ||
383 | function pthread_cond_destroy (cond : access pthread_cond_t) return int; | |
384 | pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); | |
385 | ||
386 | function pthread_cond_signal (cond : access pthread_cond_t) return int; | |
387 | pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); | |
388 | ||
389 | function pthread_cond_wait | |
390 | (cond : access pthread_cond_t; | |
391 | mutex : access pthread_mutex_t) return int; | |
392 | pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); | |
393 | ||
394 | function pthread_cond_timedwait | |
395 | (cond : access pthread_cond_t; | |
396 | mutex : access pthread_mutex_t; | |
397 | abstime : access timespec) return int; | |
398 | pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); | |
399 | ||
c470d7c9 AC |
400 | -------------------------- |
401 | -- POSIX.1c Section 13 -- | |
402 | -------------------------- | |
403 | ||
404 | PTHREAD_PRIO_NONE : constant := 0; | |
405 | PTHREAD_PRIO_INHERIT : constant := 1; | |
406 | PTHREAD_PRIO_PROTECT : constant := 2; | |
407 | ||
408 | function pthread_mutexattr_setprotocol | |
409 | (attr : access pthread_mutexattr_t; | |
410 | protocol : int) return int; | |
411 | pragma Import | |
412 | (C, pthread_mutexattr_setprotocol, "pthread_mutexattr_setprotocol"); | |
413 | ||
414 | function pthread_mutexattr_setprioceiling | |
415 | (attr : access pthread_mutexattr_t; | |
416 | prioceiling : int) return int; | |
417 | pragma Import | |
418 | (C, pthread_mutexattr_setprioceiling, | |
419 | "pthread_mutexattr_setprioceiling"); | |
420 | ||
0fe6afd3 AC |
421 | type padding is array (int range <>) of Interfaces.C.char; |
422 | ||
c470d7c9 AC |
423 | type struct_sched_param is record |
424 | sched_priority : int; -- scheduling priority | |
0fe6afd3 | 425 | opaque : padding (1 .. 4); |
c470d7c9 | 426 | end record; |
0fe6afd3 | 427 | pragma Convention (C, struct_sched_param); |
c470d7c9 AC |
428 | |
429 | function pthread_setschedparam | |
430 | (thread : pthread_t; | |
431 | policy : int; | |
432 | param : access struct_sched_param) return int; | |
433 | pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); | |
434 | ||
435 | function pthread_attr_setscope | |
436 | (attr : access pthread_attr_t; | |
437 | contentionscope : int) return int; | |
438 | pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); | |
439 | ||
440 | function pthread_attr_setinheritsched | |
441 | (attr : access pthread_attr_t; | |
442 | inheritsched : int) return int; | |
443 | pragma Import | |
444 | (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); | |
445 | ||
446 | function pthread_attr_setschedpolicy | |
447 | (attr : access pthread_attr_t; | |
448 | policy : int) return int; | |
449 | pragma Import (C, pthread_attr_setschedpolicy, "pthread_attr_setsched"); | |
450 | ||
451 | function sched_yield return int; | |
452 | ||
453 | --------------------------- | |
454 | -- P1003.1c - Section 16 -- | |
455 | --------------------------- | |
456 | ||
457 | function pthread_attr_init (attributes : access pthread_attr_t) return int; | |
458 | pragma Import (C, pthread_attr_init, "pthread_attr_init"); | |
459 | ||
460 | function pthread_attr_destroy | |
461 | (attributes : access pthread_attr_t) return int; | |
462 | pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); | |
463 | ||
464 | function pthread_attr_setdetachstate | |
465 | (attr : access pthread_attr_t; | |
466 | detachstate : int) return int; | |
467 | pragma Import | |
468 | (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); | |
469 | ||
470 | function pthread_attr_setstacksize | |
471 | (attr : access pthread_attr_t; | |
472 | stacksize : size_t) return int; | |
473 | pragma Import | |
474 | (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); | |
475 | ||
476 | function pthread_create | |
477 | (thread : access pthread_t; | |
478 | attributes : access pthread_attr_t; | |
479 | start_routine : Thread_Body; | |
480 | arg : System.Address) return int; | |
481 | pragma Import (C, pthread_create, "pthread_create"); | |
482 | ||
483 | procedure pthread_exit (status : System.Address); | |
484 | pragma Import (C, pthread_exit, "pthread_exit"); | |
485 | ||
486 | function pthread_self return pthread_t; | |
487 | pragma Import (C, pthread_self, "pthread_self"); | |
488 | ||
489 | -------------------------- | |
490 | -- POSIX.1c Section 17 -- | |
491 | -------------------------- | |
492 | ||
493 | function pthread_setspecific | |
494 | (key : pthread_key_t; | |
495 | value : System.Address) return int; | |
496 | pragma Import (C, pthread_setspecific, "pthread_setspecific"); | |
497 | ||
498 | function pthread_getspecific (key : pthread_key_t) return System.Address; | |
499 | pragma Import (C, pthread_getspecific, "pthread_getspecific"); | |
500 | ||
501 | type destructor_pointer is access procedure (arg : System.Address); | |
def46b54 | 502 | pragma Convention (C, destructor_pointer); |
c470d7c9 AC |
503 | |
504 | function pthread_key_create | |
505 | (key : access pthread_key_t; | |
506 | destructor : destructor_pointer) return int; | |
507 | pragma Import (C, pthread_key_create, "pthread_key_create"); | |
508 | ||
509 | private | |
510 | ||
0fe6afd3 AC |
511 | type sigset_t is new unsigned; |
512 | ||
513 | type int32_t is new int; | |
c470d7c9 | 514 | |
0fe6afd3 | 515 | type pid_t is new int32_t; |
c470d7c9 AC |
516 | |
517 | type time_t is new long; | |
518 | ||
519 | type timespec is record | |
520 | tv_sec : time_t; | |
4f64abad | 521 | tv_nsec : long; |
c470d7c9 AC |
522 | end record; |
523 | pragma Convention (C, timespec); | |
524 | ||
c470d7c9 AC |
525 | -- |
526 | -- Darwin specific signal implementation | |
527 | -- | |
59f3dd0a | 528 | type Pad_Type is array (1 .. 7) of unsigned_long; |
c470d7c9 AC |
529 | type siginfo_t is record |
530 | si_signo : int; -- signal number | |
531 | si_errno : int; -- errno association | |
532 | si_code : int; -- signal code | |
533 | si_pid : int; -- sending process | |
534 | si_uid : unsigned; -- sender's ruid | |
535 | si_status : int; -- exit value | |
536 | si_addr : System.Address; -- faulting instruction | |
537 | si_value : System.Address; -- signal value | |
538 | si_band : long; -- band event for SIGPOLL | |
539 | pad : Pad_Type; -- RFU | |
540 | end record; | |
541 | pragma Convention (C, siginfo_t); | |
542 | ||
c470d7c9 AC |
543 | type mcontext_t is new System.Address; |
544 | ||
545 | type ucontext_t is record | |
546 | uc_onstack : int; | |
547 | uc_sigmask : sigset_t; -- Signal Mask Used By This Context | |
548 | uc_stack : stack_t; -- Stack Used By This Context | |
549 | uc_link : System.Address; -- Pointer To Resuming Context | |
550 | uc_mcsize : size_t; -- Size of The Machine Context | |
551 | uc_mcontext : mcontext_t; -- Machine Specific Context | |
552 | end record; | |
553 | pragma Convention (C, ucontext_t); | |
554 | ||
555 | -- | |
556 | -- Darwin specific pthread implementation | |
557 | -- | |
558 | type pthread_t is new System.Address; | |
559 | ||
c470d7c9 | 560 | type pthread_attr_t is record |
0fe6afd3 | 561 | sig : long; |
59f3dd0a | 562 | opaque : padding (1 .. System.OS_Constants.PTHREAD_ATTR_SIZE); |
c470d7c9 AC |
563 | end record; |
564 | pragma Convention (C, pthread_attr_t); | |
565 | ||
566 | type pthread_mutexattr_t is record | |
0fe6afd3 | 567 | sig : long; |
59f3dd0a | 568 | opaque : padding (1 .. System.OS_Constants.PTHREAD_MUTEXATTR_SIZE); |
c470d7c9 AC |
569 | end record; |
570 | pragma Convention (C, pthread_mutexattr_t); | |
571 | ||
c470d7c9 | 572 | type pthread_mutex_t is record |
0fe6afd3 | 573 | sig : long; |
59f3dd0a | 574 | opaque : padding (1 .. System.OS_Constants.PTHREAD_MUTEX_SIZE); |
c470d7c9 AC |
575 | end record; |
576 | pragma Convention (C, pthread_mutex_t); | |
577 | ||
578 | type pthread_condattr_t is record | |
0fe6afd3 | 579 | sig : long; |
59f3dd0a | 580 | opaque : padding (1 .. System.OS_Constants.PTHREAD_CONDATTR_SIZE); |
c470d7c9 AC |
581 | end record; |
582 | pragma Convention (C, pthread_condattr_t); | |
583 | ||
584 | type pthread_cond_t is record | |
0fe6afd3 | 585 | sig : long; |
59f3dd0a | 586 | opaque : padding (1 .. System.OS_Constants.PTHREAD_COND_SIZE); |
c470d7c9 AC |
587 | end record; |
588 | pragma Convention (C, pthread_cond_t); | |
589 | ||
590 | type pthread_once_t is record | |
0fe6afd3 | 591 | sig : long; |
59f3dd0a | 592 | opaque : padding (1 .. System.OS_Constants.PTHREAD_ONCE_SIZE); |
c470d7c9 AC |
593 | end record; |
594 | pragma Convention (C, pthread_once_t); | |
595 | ||
c470d7c9 AC |
596 | type pthread_key_t is new unsigned_long; |
597 | ||
598 | end System.OS_Interface; |