1------------------------------------------------------------------------------
2--                                                                          --
3--                GNU ADA 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--                                  S p e c                                 --
8--                                                                          --
9--            Copyright (C) 2000-2003 Ada Core Technologies, Inc.           --
10--                                                                          --
11-- GNARL is free software; you can  redistribute it  and/or modify it under --
12-- terms of the  GNU General Public License as published  by the Free Soft- --
13-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
14-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
15-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17-- for  more details.  You should have  received  a copy of the GNU General --
18-- Public License  distributed with GNARL; see file COPYING.  If not, write --
19-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
20-- MA 02111-1307, USA.                                                      --
21--                                                                          --
22-- As a special exception,  if other files  instantiate  generics from this --
23-- unit, or you link  this unit with other files  to produce an executable, --
24-- this  unit  does not  by itself cause  the resulting  executable  to  be --
25-- covered  by the  GNU  General  Public  License.  This exception does not --
26-- however invalidate  any other reasons why  the executable file  might be --
27-- covered by the  GNU Public License.                                      --
28--                                                                          --
29-- GNARL was developed by the GNARL team at Florida State University.       --
30-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
31--                                                                          --
32------------------------------------------------------------------------------
33
34--  This is a Solaris (POSIX Threads) version of this package.
35
36--  This package encapsulates all direct interfaces to OS services
37--  that are needed by children of System.
38
39--  PLEASE DO NOT add any with-clauses to this package
40--  or remove the pragma Elaborate_Body.
41--  It is designed to be a bottom-level (leaf) package.
42
43with Interfaces.C;
44package System.OS_Interface is
45   pragma Preelaborate;
46
47   pragma Linker_Options ("-lposix4");
48   pragma Linker_Options ("-lpthread");
49
50   subtype int            is Interfaces.C.int;
51   subtype short          is Interfaces.C.short;
52   subtype long           is Interfaces.C.long;
53   subtype unsigned       is Interfaces.C.unsigned;
54   subtype unsigned_short is Interfaces.C.unsigned_short;
55   subtype unsigned_long  is Interfaces.C.unsigned_long;
56   subtype unsigned_char  is Interfaces.C.unsigned_char;
57   subtype plain_char     is Interfaces.C.plain_char;
58   subtype size_t         is Interfaces.C.size_t;
59
60   -----------
61   -- Errno --
62   -----------
63
64   function errno return int;
65   pragma Import (C, errno, "__get_errno");
66
67   EAGAIN    : constant := 11;
68   EINTR     : constant := 4;
69   EINVAL    : constant := 22;
70   ENOMEM    : constant := 12;
71   ETIMEDOUT : constant := 145;
72
73   -------------
74   -- Signals --
75   -------------
76
77   Max_Interrupt : constant := 45;
78   type Signal is new int range 0 .. Max_Interrupt;
79   for Signal'Size use int'Size;
80
81   SIGHUP      : constant := 1; --  hangup
82   SIGINT      : constant := 2; --  interrupt (rubout)
83   SIGQUIT     : constant := 3; --  quit (ASCD FS)
84   SIGILL      : constant := 4; --  illegal instruction (not reset)
85   SIGTRAP     : constant := 5; --  trace trap (not reset)
86   SIGIOT      : constant := 6; --  IOT instruction
87   SIGABRT     : constant := 6; --  used by abort, replace SIGIOT in the future
88   SIGEMT      : constant := 7; --  EMT instruction
89   SIGFPE      : constant := 8; --  floating point exception
90   SIGKILL     : constant := 9; --  kill (cannot be caught or ignored)
91   SIGBUS      : constant := 10; --  bus error
92   SIGSEGV     : constant := 11; --  segmentation violation
93   SIGSYS      : constant := 12; --  bad argument to system call
94   SIGPIPE     : constant := 13; --  write on a pipe with no one to read it
95   SIGALRM     : constant := 14; --  alarm clock
96   SIGTERM     : constant := 15; --  software termination signal from kill
97   SIGUSR1     : constant := 16; --  user defined signal 1
98   SIGUSR2     : constant := 17; --  user defined signal 2
99   SIGCLD      : constant := 18; --  alias for SIGCHLD
100   SIGCHLD     : constant := 18; --  child status change
101   SIGPWR      : constant := 19; --  power-fail restart
102   SIGWINCH    : constant := 20; --  window size change
103   SIGURG      : constant := 21; --  urgent condition on IO channel
104   SIGPOLL     : constant := 22; --  pollable event occurred
105   SIGIO       : constant := 22; --  I/O possible (Solaris SIGPOLL alias)
106   SIGSTOP     : constant := 23; --  stop (cannot be caught or ignored)
107   SIGTSTP     : constant := 24; --  user stop requested from tty
108   SIGCONT     : constant := 25; --  stopped process has been continued
109   SIGTTIN     : constant := 26; --  background tty read attempted
110   SIGTTOU     : constant := 27; --  background tty write attempted
111   SIGVTALRM   : constant := 28; --  virtual timer expired
112   SIGPROF     : constant := 29; --  profiling timer expired
113   SIGXCPU     : constant := 30; --  CPU time limit exceeded
114   SIGXFSZ     : constant := 31; --  filesize limit exceeded
115   SIGWAITING  : constant := 32; --  process's lwps blocked (Solaris)
116   SIGLWP      : constant := 33; --  used by thread library (Solaris)
117   SIGFREEZE   : constant := 34; --  used by CPR (Solaris)
118   SIGTHAW     : constant := 35; --  used by CPR (Solaris)
119   SIGCANCEL   : constant := 36; --  thread cancellation signal (libthread)
120
121   SIGADAABORT : constant := SIGABRT;
122
123   type Signal_Set is array (Natural range <>) of Signal;
124
125   Unmasked    : constant Signal_Set := (SIGTRAP, SIGLWP, SIGPROF);
126
127   --  Following signals should not be disturbed.
128   --  See c-posix-signals.c in FLORIST
129
130   Reserved    : constant Signal_Set :=
131     (SIGKILL, SIGSTOP, SIGWAITING, SIGCANCEL);
132
133   type sigset_t is private;
134
135   function sigaddset (set : access sigset_t; sig : Signal) return int;
136   pragma Import (C, sigaddset, "sigaddset");
137
138   function sigdelset (set : access sigset_t; sig : Signal) return int;
139   pragma Import (C, sigdelset, "sigdelset");
140
141   function sigfillset (set : access sigset_t) return int;
142   pragma Import (C, sigfillset, "sigfillset");
143
144   function sigismember (set : access sigset_t; sig : Signal) return int;
145   pragma Import (C, sigismember, "sigismember");
146
147   function sigemptyset (set : access sigset_t) return int;
148   pragma Import (C, sigemptyset, "sigemptyset");
149
150   type struct_sigaction is record
151      sa_flags   : int;
152      sa_handler : System.Address;
153      sa_mask    : sigset_t;
154      sa_resv1   : int;
155      sa_resv2   : int;
156   end record;
157   pragma Convention (C, struct_sigaction);
158   type struct_sigaction_ptr is access all struct_sigaction;
159
160   SA_SIGINFO : constant := 16#0008#;
161
162   SIG_BLOCK   : constant := 1;
163   SIG_UNBLOCK : constant := 2;
164   SIG_SETMASK : constant := 3;
165
166   SIG_DFL : constant := 0;
167   SIG_IGN : constant := 1;
168
169   function sigaction
170     (sig  : Signal;
171      act  : struct_sigaction_ptr;
172      oact : struct_sigaction_ptr) return int;
173   pragma Import (C, sigaction, "sigaction");
174
175   ----------
176   -- Time --
177   ----------
178
179   Time_Slice_Supported : constant Boolean := True;
180   --  Indicates wether time slicing is supported
181
182   type timespec is private;
183
184   type clockid_t is private;
185
186   CLOCK_REALTIME : constant clockid_t;
187
188   function clock_gettime
189     (clock_id : clockid_t;
190      tp       : access timespec) return int;
191   pragma Import (C, clock_gettime, "clock_gettime");
192
193   function To_Duration (TS : timespec) return Duration;
194   pragma Inline (To_Duration);
195
196   function To_Timespec (D : Duration) return timespec;
197   pragma Inline (To_Timespec);
198
199   type struct_timeval is private;
200
201   function To_Duration (TV : struct_timeval) return Duration;
202   pragma Inline (To_Duration);
203
204   function To_Timeval (D : Duration) return struct_timeval;
205   pragma Inline (To_Timeval);
206
207   -------------------------
208   -- Priority Scheduling --
209   -------------------------
210
211   SCHED_FIFO  : constant := 1;
212   SCHED_RR    : constant := 2;
213   SCHED_OTHER : constant := 0;
214
215   -------------
216   -- Process --
217   -------------
218
219   type pid_t is private;
220
221   function kill (pid : pid_t; sig : Signal) return int;
222   pragma Import (C, kill, "kill");
223
224   function getpid return pid_t;
225   pragma Import (C, getpid, "getpid");
226
227   ---------
228   -- LWP --
229   ---------
230
231   function lwp_self return System.Address;
232   pragma Import (C, lwp_self, "_lwp_self");
233
234   -------------
235   -- Threads --
236   -------------
237
238   type Thread_Body is access
239     function (arg : System.Address) return System.Address;
240   type pthread_t           is private;
241   subtype Thread_Id        is pthread_t;
242
243   type pthread_mutex_t     is limited private;
244   type pthread_cond_t      is limited private;
245   type pthread_attr_t      is limited private;
246   type pthread_mutexattr_t is limited private;
247   type pthread_condattr_t  is limited private;
248   type pthread_key_t       is private;
249
250   PTHREAD_CREATE_DETACHED : constant := 16#40#;
251
252   -----------
253   -- Stack --
254   -----------
255
256   Stack_Base_Available : constant Boolean := False;
257   --  Indicates wether the stack base is available on this target.
258
259   function Get_Stack_Base (thread : pthread_t) return Address;
260   pragma Inline (Get_Stack_Base);
261   --  returns the stack base of the specified thread.
262   --  Only call this function when Stack_Base_Available is True.
263
264   function Get_Page_Size return size_t;
265   function Get_Page_Size return Address;
266   pragma Import (C, Get_Page_Size, "getpagesize");
267   --  returns the size of a page, or 0 if this is not relevant on this
268   --  target
269
270   PROT_NONE  : constant := 0;
271   PROT_READ  : constant := 1;
272   PROT_WRITE : constant := 2;
273   PROT_EXEC  : constant := 4;
274   PROT_ALL   : constant := PROT_READ + PROT_WRITE + PROT_EXEC;
275
276   PROT_ON    : constant := PROT_READ;
277   PROT_OFF   : constant := PROT_ALL;
278
279   function mprotect (addr : Address; len : size_t; prot : int) return int;
280   pragma Import (C, mprotect);
281
282   ---------------------------------------
283   -- Nonstandard Thread Initialization --
284   ---------------------------------------
285
286   procedure pthread_init;
287   --  This is a dummy procedure to share some GNULLI files
288
289   -------------------------
290   -- POSIX.1c  Section 3 --
291   -------------------------
292
293   function sigwait
294     (set : access sigset_t;
295      sig : access Signal) return int;
296   pragma Import (C, sigwait, "__posix_sigwait");
297
298   function pthread_kill
299     (thread : pthread_t;
300      sig    : Signal) return int;
301   pragma Import (C, pthread_kill, "pthread_kill");
302
303   type sigset_t_ptr is access all sigset_t;
304
305   function pthread_sigmask
306     (how  : int;
307      set  : sigset_t_ptr;
308      oset : sigset_t_ptr) return int;
309   pragma Import (C, pthread_sigmask, "pthread_sigmask");
310
311   --------------------------
312   -- POSIX.1c  Section 11 --
313   --------------------------
314
315   function pthread_mutexattr_init
316     (attr : access pthread_mutexattr_t) return int;
317   pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init");
318
319   function pthread_mutexattr_destroy
320     (attr : access pthread_mutexattr_t) return int;
321   pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy");
322
323   function pthread_mutex_init
324     (mutex : access pthread_mutex_t;
325      attr  : access pthread_mutexattr_t) return int;
326   pragma Import (C, pthread_mutex_init, "pthread_mutex_init");
327
328   function pthread_mutex_destroy (mutex : access pthread_mutex_t) return int;
329   pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy");
330
331   function pthread_mutex_lock (mutex : access pthread_mutex_t) return int;
332   pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock");
333
334   function pthread_mutex_unlock (mutex : access pthread_mutex_t) return int;
335   pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock");
336
337   function pthread_condattr_init
338     (attr : access pthread_condattr_t) return int;
339   pragma Import (C, pthread_condattr_init, "pthread_condattr_init");
340
341   function pthread_condattr_destroy
342     (attr : access pthread_condattr_t) return int;
343   pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy");
344
345   function pthread_cond_init
346     (cond : access pthread_cond_t;
347      attr : access pthread_condattr_t) return int;
348   pragma Import (C, pthread_cond_init, "pthread_cond_init");
349
350   function pthread_cond_destroy (cond : access pthread_cond_t) return int;
351   pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy");
352
353   function pthread_cond_signal (cond : access pthread_cond_t) return int;
354   pragma Import (C, pthread_cond_signal, "pthread_cond_signal");
355
356   function pthread_cond_wait
357     (cond  : access pthread_cond_t;
358      mutex : access pthread_mutex_t) return int;
359   pragma Import (C, pthread_cond_wait, "pthread_cond_wait");
360
361   function pthread_cond_timedwait
362     (cond    : access pthread_cond_t;
363      mutex   : access pthread_mutex_t;
364      abstime : access timespec) return int;
365   pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait");
366
367   Relative_Timed_Wait : constant Boolean := False;
368   --  pthread_cond_timedwait requires an absolute delay time
369
370   --------------------------
371   -- POSIX.1c  Section 13 --
372   --------------------------
373
374   PTHREAD_PRIO_NONE    : constant := 0;
375   PTHREAD_PRIO_INHERIT : constant := 16#10#;
376   PTHREAD_PRIO_PROTECT : constant := 16#20#;
377
378   function pthread_mutexattr_setprotocol
379     (attr     : access pthread_mutexattr_t;
380      protocol : int) return int;
381   pragma Import (C, pthread_mutexattr_setprotocol);
382
383   function pthread_mutexattr_setprioceiling
384     (attr        : access pthread_mutexattr_t;
385      prioceiling : int) return int;
386   pragma Import (C, pthread_mutexattr_setprioceiling);
387
388   type Array_8_Int is array (0 .. 7) of int;
389   type struct_sched_param is record
390      sched_priority : int;
391      sched_pad      : Array_8_Int;
392   end record;
393
394   function pthread_setschedparam
395     (thread : pthread_t;
396      policy : int;
397      param  : access struct_sched_param) return int;
398   pragma Import (C, pthread_setschedparam, "pthread_setschedparam");
399
400   function pthread_attr_setscope
401     (attr            : access pthread_attr_t;
402      contentionscope : int) return int;
403   pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope");
404
405   function pthread_attr_setinheritsched
406     (attr         : access pthread_attr_t;
407      inheritsched : int) return int;
408   pragma Import (C, pthread_attr_setinheritsched);
409
410   function pthread_attr_setschedpolicy
411     (attr   : access pthread_attr_t;
412      policy : int) return int;
413   pragma Import (C, pthread_attr_setschedpolicy);
414
415   function sched_yield return int;
416   pragma Import (C, sched_yield, "sched_yield");
417
418   ---------------------------
419   -- P1003.1c - Section 16 --
420   ---------------------------
421
422   function pthread_attr_init (attributes : access pthread_attr_t) return int;
423   pragma Import (C, pthread_attr_init, "pthread_attr_init");
424
425   function pthread_attr_destroy
426     (attributes : access pthread_attr_t) return int;
427   pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy");
428
429   function pthread_attr_setdetachstate
430     (attr        : access pthread_attr_t;
431      detachstate : int) return int;
432   pragma Import (C, pthread_attr_setdetachstate);
433
434   function pthread_attr_setstacksize
435     (attr      : access pthread_attr_t;
436      stacksize : size_t) return int;
437   pragma Import (C, pthread_attr_setstacksize);
438
439   function pthread_create
440     (thread        : access pthread_t;
441      attributes    : access pthread_attr_t;
442      start_routine : Thread_Body;
443      arg           : System.Address) return int;
444   pragma Import (C, pthread_create, "pthread_create");
445
446   procedure pthread_exit (status : System.Address);
447   pragma Import (C, pthread_exit, "pthread_exit");
448
449   function pthread_self return pthread_t;
450   pragma Import (C, pthread_self, "pthread_self");
451
452   --------------------------
453   -- POSIX.1c  Section 17 --
454   --------------------------
455
456   function pthread_setspecific
457     (key   : pthread_key_t;
458      value : System.Address) return int;
459   pragma Import (C, pthread_setspecific, "pthread_setspecific");
460
461   function pthread_getspecific (key : pthread_key_t) return System.Address;
462   pragma Import (C, pthread_getspecific, "pthread_getspecific");
463
464   type destructor_pointer is access procedure (arg : System.Address);
465
466   function pthread_key_create
467     (key        : access pthread_key_t;
468      destructor : destructor_pointer) return int;
469   pragma Import (C, pthread_key_create, "pthread_key_create");
470
471private
472
473   type array_type_1 is array (Integer range 0 .. 3) of unsigned_long;
474   type sigset_t is record
475      X_X_sigbits  : array_type_1;
476   end record;
477   pragma Convention (C, sigset_t);
478
479   type pid_t is new long;
480
481   type time_t is new long;
482
483   type timespec is record
484      tv_sec  : time_t;
485      tv_nsec : long;
486   end record;
487   pragma Convention (C, timespec);
488
489   type clockid_t is new int;
490   CLOCK_REALTIME : constant clockid_t := 0;
491
492   type struct_timeval is record
493      tv_sec  : time_t;
494      tv_usec : time_t;
495   end record;
496   pragma Convention (C, struct_timeval);
497
498   type pthread_attr_t is record
499      pthread_attrp : System.Address;
500   end record;
501   pragma Convention (C, pthread_attr_t);
502
503   type pthread_condattr_t is record
504      pthread_condattrp : System.Address;
505   end record;
506   pragma Convention (C, pthread_condattr_t);
507
508   type pthread_mutexattr_t is record
509      pthread_mutexattrp : System.Address;
510   end record;
511   pragma Convention (C, pthread_mutexattr_t);
512
513   type pthread_t is new unsigned;
514
515   type uint64_t is mod 2 ** 64;
516
517   type pthread_mutex_t is record
518      pthread_mutex_flags   : uint64_t;
519      pthread_mutex_owner64 : uint64_t;
520      pthread_mutex_data    : uint64_t;
521   end record;
522   pragma Convention (C, pthread_mutex_t);
523   type pthread_mutex_t_ptr is access pthread_mutex_t;
524
525   type pthread_cond_t is record
526      pthread_cond_flags : uint64_t;
527      pthread_cond_data  : uint64_t;
528   end record;
529   pragma Convention (C, pthread_cond_t);
530
531   type pthread_key_t is new unsigned;
532
533end System.OS_Interface;
534