OSDN Git Service

2003-10-21 Arnaud Charlet <charlet@act-europe.fr>
[pf3gnuchains/gcc-fork.git] / gcc / ada / 5zosinte.ads
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) 1997-2002 Free Software Foundation, 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 the VxWorks version of this package.
35 --
36 --  VxWorks does not directly support the needed POSIX routines, but it
37 --  does have other routines that make it possible to code equivalent
38 --  POSIX compliant routines.  The approach taken is to provide an
39 --  FSU threads compliant interface.
40
41 --  This package encapsulates all direct interfaces to OS services
42 --  that are needed by children of System.
43
44 --  PLEASE DO NOT add any with-clauses to this package
45 --  or remove the pragma Elaborate_Body.
46 --  It is designed to be a bottom-level (leaf) package.
47
48 with Interfaces.C;
49 with System.VxWorks;
50
51 package System.OS_Interface is
52    pragma Preelaborate;
53
54    subtype int         is Interfaces.C.int;
55    subtype short       is Short_Integer;
56    type long           is new Long_Integer;
57    type unsigned_long  is mod 2 ** long'Size;
58    type size_t         is mod 2 ** Standard'Address_Size;
59
60    -----------
61    -- Errno --
62    -----------
63
64    function errno return int;
65    pragma Import (C, errno, "errnoGet");
66
67    EINTR     : constant := 4;
68    EAGAIN    : constant := 35;
69    ENOMEM    : constant := 12;
70    EINVAL    : constant := 22;
71    ETIMEDOUT : constant := 60;
72
73    FUNC_ERR  : constant := -1;
74
75    ----------------------------
76    -- Signals and Interrupts --
77    ----------------------------
78
79    NSIG : constant := 32;
80    --  Number of signals on the target OS
81    type Signal is new int range 0 .. Interfaces.C."-" (NSIG, 1);
82
83    Max_HW_Interrupt : constant := System.VxWorks.Num_HW_Interrupts - 1;
84    type HW_Interrupt is new int range 0 .. Max_HW_Interrupt;
85
86    Max_Interrupt : constant := Max_HW_Interrupt;
87
88    SIGILL  : constant :=  4; --  illegal instruction (not reset)
89    SIGABRT : constant :=  6; --  used by abort, replace SIGIOT in the future
90    SIGFPE  : constant :=  8; --  floating point exception
91    SIGBUS  : constant := 10; --  bus error
92    SIGSEGV : constant := 11; --  segmentation violation
93
94    -----------------------------------
95    -- Signal processing definitions --
96    -----------------------------------
97
98    --  The how in sigprocmask().
99    SIG_BLOCK   : constant := 1;
100    SIG_UNBLOCK : constant := 2;
101    SIG_SETMASK : constant := 3;
102
103    --  The sa_flags in struct sigaction.
104    SA_SIGINFO   : constant := 16#0002#;
105    SA_ONSTACK   : constant := 16#0004#;
106
107    SIG_DFL : constant := 0;
108    SIG_IGN : constant := 1;
109
110    type sigset_t is private;
111
112    type struct_sigaction is record
113       sa_handler : System.Address;
114       sa_mask    : sigset_t;
115       sa_flags   : int;
116    end record;
117    pragma Convention (C, struct_sigaction);
118    type struct_sigaction_ptr is access all struct_sigaction;
119
120    function sigaddset (set : access sigset_t; sig : Signal) return int;
121    pragma Import (C, sigaddset, "sigaddset");
122
123    function sigdelset (set : access sigset_t; sig : Signal) return int;
124    pragma Import (C, sigdelset, "sigdelset");
125
126    function sigfillset (set : access sigset_t) return int;
127    pragma Import (C, sigfillset, "sigfillset");
128
129    function sigismember (set : access sigset_t; sig : Signal) return int;
130    pragma Import (C, sigismember, "sigismember");
131
132    function sigemptyset (set : access sigset_t) return int;
133    pragma Import (C, sigemptyset, "sigemptyset");
134
135    function sigaction
136      (sig  : Signal;
137       act  : struct_sigaction_ptr;
138       oact : struct_sigaction_ptr) return int;
139    pragma Import (C, sigaction, "sigaction");
140
141    type isr_address is access procedure (sig : int);
142
143    function c_signal (sig : Signal; handler : isr_address) return isr_address;
144    pragma Import (C, c_signal, "signal");
145
146    function sigwait (set : access sigset_t; sig : access Signal) return int;
147    pragma Inline (sigwait);
148
149    type sigset_t_ptr is access all sigset_t;
150
151    function pthread_sigmask
152      (how  : int;
153       set  : sigset_t_ptr;
154       oset : sigset_t_ptr) return int;
155    pragma Import (C, pthread_sigmask, "sigprocmask");
156
157    type t_id is new long;
158    subtype Thread_Id is t_id;
159
160    function kill (pid : t_id; sig : Signal) return int;
161    pragma Import (C, kill, "kill");
162
163    --  VxWorks doesn't have getpid; taskIdSelf is the equivalent
164    --  routine.
165    function getpid return t_id;
166    pragma Import (C, getpid, "taskIdSelf");
167
168    ----------
169    -- Time --
170    ----------
171
172    type time_t is new unsigned_long;
173
174    type timespec is record
175       ts_sec  : time_t;
176       ts_nsec : long;
177    end record;
178    pragma Convention (C, timespec);
179
180    type clockid_t is private;
181
182    CLOCK_REALTIME : constant clockid_t;   --  System wide realtime clock
183
184    function To_Duration (TS : timespec) return Duration;
185    pragma Inline (To_Duration);
186
187    function To_Timespec (D : Duration) return timespec;
188    pragma Inline (To_Timespec);
189
190    function To_Clock_Ticks (D : Duration) return int;
191    --  Convert a duration value (in seconds) into clock ticks.
192
193    function clock_gettime
194      (clock_id : clockid_t; tp : access timespec) return int;
195    pragma Import (C, clock_gettime, "clock_gettime");
196
197    type ULONG is new unsigned_long;
198
199    procedure tickSet (ticks : ULONG);
200    pragma Import (C, tickSet, "tickSet");
201
202    function tickGet return ULONG;
203    pragma Import (C, tickGet, "tickGet");
204
205    -----------------------------------------------------
206    --  Convenience routine to convert between VxWorks --
207    --  priority and Ada priority.                     --
208    -----------------------------------------------------
209
210    function To_VxWorks_Priority (Priority : in int) return int;
211    pragma Inline (To_VxWorks_Priority);
212
213    --------------------------
214    -- VxWorks specific API --
215    --------------------------
216
217    subtype STATUS is int;
218    --  Equivalent of the C type STATUS
219
220    OK    : constant STATUS := 0;
221    ERROR : constant STATUS := Interfaces.C.int (-1);
222
223    function taskIdVerify (tid : t_id)  return STATUS;
224    pragma Import (C, taskIdVerify, "taskIdVerify");
225
226    function taskIdSelf return t_id;
227    pragma Import (C, taskIdSelf, "taskIdSelf");
228
229    function taskSuspend (tid : t_id) return int;
230    pragma Import (C, taskSuspend, "taskSuspend");
231
232    function taskResume (tid : t_id) return int;
233    pragma Import (C, taskResume, "taskResume");
234
235    function taskIsSuspended (tid : t_id) return int;
236    pragma Import (C, taskIsSuspended, "taskIsSuspended");
237
238    function taskVarAdd
239      (tid : t_id; pVar : access System.Address) return int;
240    pragma Import (C, taskVarAdd, "taskVarAdd");
241
242    function taskVarDelete
243      (tid : t_id; pVar : access System.Address) return int;
244    pragma Import (C, taskVarDelete, "taskVarDelete");
245
246    function taskVarSet
247      (tid   : t_id;
248       pVar  : access System.Address;
249       value : System.Address) return int;
250    pragma Import (C, taskVarSet, "taskVarSet");
251
252    function taskVarGet
253      (tid  : t_id;
254       pVar : access System.Address) return int;
255    pragma Import (C, taskVarGet, "taskVarGet");
256
257    function taskDelay (ticks : int) return int;
258    procedure taskDelay (ticks : int);
259    pragma Import (C, taskDelay, "taskDelay");
260
261    function sysClkRateGet return int;
262    pragma Import (C, sysClkRateGet, "sysClkRateGet");
263
264    --  Option flags for taskSpawn
265
266    VX_UNBREAKABLE    : constant := 16#0002#;
267    VX_FP_TASK        : constant := 16#0008#;
268    VX_FP_PRIVATE_ENV : constant := 16#0080#;
269    VX_NO_STACK_FILL  : constant := 16#0100#;
270
271    function taskSpawn
272      (name          : System.Address;  --  Pointer to task name
273       priority      : int;
274       options       : int;
275       stacksize     : size_t;
276       start_routine : System.Address;
277       arg1          : System.Address;
278       arg2          : int := 0;
279       arg3          : int := 0;
280       arg4          : int := 0;
281       arg5          : int := 0;
282       arg6          : int := 0;
283       arg7          : int := 0;
284       arg8          : int := 0;
285       arg9          : int := 0;
286       arg10         : int := 0) return t_id;
287    pragma Import (C, taskSpawn, "taskSpawn");
288
289    procedure taskDelete (tid : t_id);
290    pragma Import (C, taskDelete, "taskDelete");
291
292    function kernelTimeSlice (ticks : int) return int;
293    pragma Import (C, kernelTimeSlice, "kernelTimeSlice");
294
295    function taskPrioritySet
296      (tid : t_id; newPriority : int) return int;
297    pragma Import (C, taskPrioritySet, "taskPrioritySet");
298
299    --  Semaphore creation flags.
300
301    SEM_Q_FIFO         : constant := 0;
302    SEM_Q_PRIORITY     : constant := 1;
303    SEM_DELETE_SAFE    : constant := 4;  -- only valid for binary semaphore
304    SEM_INVERSION_SAFE : constant := 8;  -- only valid for binary semaphore
305
306    --  Semaphore initial state flags
307
308    SEM_EMPTY : constant := 0;
309    SEM_FULL  : constant := 1;
310
311    --  Semaphore take (semTake) time constants.
312
313    WAIT_FOREVER : constant := -1;
314    NO_WAIT      : constant := 0;
315
316    --  Error codes (errno).  The lower level 16 bits are the
317    --  error code, with the upper 16 bits representing the
318    --  module number in which the error occurred.  By convention,
319    --  the module number is 0 for UNIX errors.  VxWorks reserves
320    --  module numbers 1-500, with the remaining module numbers
321    --  being available for user applications.
322
323    M_objLib                 : constant := 61 * 2**16;
324    --  semTake() failure with ticks = NO_WAIT
325    S_objLib_OBJ_UNAVAILABLE : constant := M_objLib + 2;
326    --  semTake() timeout with ticks > NO_WAIT
327    S_objLib_OBJ_TIMEOUT     : constant := M_objLib + 4;
328
329    type SEM_ID is new System.Address;
330    --  typedef struct semaphore *SEM_ID;
331
332    --  We use two different kinds of VxWorks semaphores: mutex
333    --  and binary semaphores.  A null ID is returned when
334    --  a semaphore cannot be created.
335
336    function semBCreate (options : int; initial_state : int) return SEM_ID;
337    --  Create a binary semaphore. Return ID, or 0 if memory could not
338    --  be allocated.
339    pragma Import (C, semBCreate, "semBCreate");
340
341    function semMCreate (options : int) return SEM_ID;
342    pragma Import (C, semMCreate, "semMCreate");
343
344    function semDelete (Sem : SEM_ID) return int;
345    --  Delete a semaphore
346    pragma Import (C, semDelete, "semDelete");
347
348    function semGive (Sem : SEM_ID) return int;
349    pragma Import (C, semGive, "semGive");
350
351    function semTake (Sem : SEM_ID; timeout : int) return int;
352    --  Attempt to take binary semaphore.  Error is returned if operation
353    --  times out
354    pragma Import (C, semTake, "semTake");
355
356    function semFlush (SemID : SEM_ID) return STATUS;
357    --  Release all threads blocked on the semaphore
358    pragma Import (C, semFlush, "semFlush");
359
360    function taskLock return int;
361    pragma Import (C, taskLock, "taskLock");
362
363    function taskUnlock return int;
364    pragma Import (C, taskUnlock, "taskUnlock");
365
366 private
367    type sigset_t is new long;
368
369    type pid_t is new int;
370
371    ERROR_PID : constant pid_t := -1;
372
373    type clockid_t is new int;
374    CLOCK_REALTIME : constant clockid_t := 0;
375
376 end System.OS_Interface;