OSDN Git Service

* Makefile.in (reload1.o-warn): Remove.
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-osinte-aix.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) 1997-2007, 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,  51  Franklin  Street,  Fifth  Floor, --
20 -- Boston, MA 02110-1301, 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 AIX (Native) version of this package
35
36 pragma Polling (Off);
37 --  Turn off polling, we do not want ATC polling to take place during tasking
38 --  operations. It causes infinite loops and other problems.
39
40 package body System.OS_Interface is
41
42    use Interfaces.C;
43
44    -----------------
45    -- To_Duration --
46    -----------------
47
48    function To_Duration (TS : timespec) return Duration is
49    begin
50       return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9;
51    end To_Duration;
52
53    function To_Duration (TV : struct_timeval) return Duration is
54    begin
55       return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6;
56    end To_Duration;
57
58    ------------------------
59    -- To_Target_Priority --
60    ------------------------
61
62    function To_Target_Priority
63      (Prio : System.Any_Priority) return Interfaces.C.int
64    is
65       Dispatching_Policy : Character;
66       pragma Import (C, Dispatching_Policy, "__gl_task_dispatching_policy");
67
68    begin
69       --  For the case SCHED_OTHER the only valid priority across all supported
70       --  versions of AIX is 1. Otherwise, for SCHED_RR and SCHED_FIFO, the
71       --  system defines priorities in the range 1 .. 127. This means that we
72       --  must map System.Any_Priority in the range 0 .. 126 to 1 .. 127.
73
74       if Dispatching_Policy = ' ' then
75          return 1;
76       else
77          return Interfaces.C.int (Prio) + 1;
78       end if;
79    end To_Target_Priority;
80
81    -----------------
82    -- To_Timespec --
83    -----------------
84
85    function To_Timespec (D : Duration) return timespec is
86       S : time_t;
87       F : Duration;
88
89    begin
90       S := time_t (Long_Long_Integer (D));
91       F := D - Duration (S);
92
93       --  If F is negative due to a round-up, adjust for positive F value
94
95       if F < 0.0 then
96          S := S - 1;
97          F := F + 1.0;
98       end if;
99
100       return timespec'(tv_sec => S,
101                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
102    end To_Timespec;
103
104    ----------------
105    -- To_Timeval --
106    ----------------
107
108    function To_Timeval (D : Duration) return struct_timeval is
109       S : long;
110       F : Duration;
111
112    begin
113       S := long (Long_Long_Integer (D));
114       F := D - Duration (S);
115
116       --  If F is negative due to a round-up, adjust for positive F value
117
118       if F < 0.0 then
119          S := S - 1;
120          F := F + 1.0;
121       end if;
122
123       return
124         struct_timeval'
125           (tv_sec => S,
126            tv_usec => long (Long_Long_Integer (F * 10#1#E6)));
127    end To_Timeval;
128
129    -------------------
130    -- clock_gettime --
131    -------------------
132
133    function clock_gettime
134      (clock_id : clockid_t;
135       tp       : access timespec)
136       return     int
137    is
138       pragma Warnings (Off, clock_id);
139
140       Result : int;
141       tv     : aliased struct_timeval;
142
143       function gettimeofday
144         (tv   : access struct_timeval;
145          tz   : System.Address := System.Null_Address)
146          return int;
147       pragma Import (C, gettimeofday, "gettimeofday");
148
149    begin
150       Result := gettimeofday (tv'Unchecked_Access);
151       tp.all := To_Timespec (To_Duration (tv));
152       return Result;
153    end clock_gettime;
154
155    -----------------
156    -- sched_yield --
157    -----------------
158
159    --  AIX Thread does not have sched_yield;
160
161    function sched_yield return int is
162       procedure pthread_yield;
163       pragma Import (C, pthread_yield, "sched_yield");
164    begin
165       pthread_yield;
166       return 0;
167    end sched_yield;
168
169    --------------------
170    -- Get_Stack_Base --
171    --------------------
172
173    function Get_Stack_Base (thread : pthread_t) return Address is
174       pragma Warnings (Off, thread);
175    begin
176       return Null_Address;
177    end Get_Stack_Base;
178
179    --------------------------
180    -- PTHREAD_PRIO_INHERIT --
181    --------------------------
182
183    AIX_Version : Integer := 0;
184    --  AIX version in the form xy for AIX version x.y (0 means not set)
185
186    SYS_NMLN : constant := 32;
187    --  AIX system constant used to define utsname, see sys/utsname.h
188
189    subtype String_NMLN is String (1 .. SYS_NMLN);
190
191    type utsname is record
192       sysname    : String_NMLN;
193       nodename   : String_NMLN;
194       release    : String_NMLN;
195       version    : String_NMLN;
196       machine    : String_NMLN;
197       procserial : String_NMLN;
198    end record;
199    pragma Convention (C, utsname);
200
201    procedure uname (name : out utsname);
202    pragma Import (C, uname);
203
204    function PTHREAD_PRIO_INHERIT return int is
205       name : utsname;
206
207       function Val (C : Character) return Integer;
208       --  Transform a numeric character ('0' .. '9') to an integer
209
210       ---------
211       -- Val --
212       ---------
213
214       function Val (C : Character) return Integer is
215       begin
216          return Character'Pos (C) - Character'Pos ('0');
217       end Val;
218
219    --  Start of processing for PTHREAD_PRIO_INHERIT
220
221    begin
222       if AIX_Version = 0 then
223
224          --  Set AIX_Version
225
226          uname (name);
227          AIX_Version := Val (name.version (1)) * 10 + Val (name.release (1));
228       end if;
229
230       if AIX_Version < 53 then
231
232          --  Under AIX < 5.3, PTHREAD_PRIO_INHERIT is defined as 0 in pthread.h
233
234          return 0;
235
236       else
237          --  Under AIX >= 5.3, PTHREAD_PRIO_INHERIT is defined as 3
238
239          return 3;
240       end if;
241    end PTHREAD_PRIO_INHERIT;
242
243 end System.OS_Interface;