OSDN Git Service

2006-10-31 Arnaud Charlet <charlet@adacore.com>
[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-2006, Free Software Fundation, 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
38 --  tasking 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    begin
66       --  Priorities on AIX are defined in the range 1 .. 127, so we
67       --  map 0 .. 126 to 1 .. 127.
68
69       return Interfaces.C.int (Prio) + 1;
70    end To_Target_Priority;
71
72    -----------------
73    -- To_Timespec --
74    -----------------
75
76    function To_Timespec (D : Duration) return timespec is
77       S : time_t;
78       F : Duration;
79
80    begin
81       S := time_t (Long_Long_Integer (D));
82       F := D - Duration (S);
83
84       --  If F has negative value due to a round-up, adjust for positive F
85       --  value.
86
87       if F < 0.0 then
88          S := S - 1;
89          F := F + 1.0;
90       end if;
91
92       return timespec'(tv_sec => S,
93                        tv_nsec => long (Long_Long_Integer (F * 10#1#E9)));
94    end To_Timespec;
95
96    ----------------
97    -- To_Timeval --
98    ----------------
99
100    function To_Timeval (D : Duration) return struct_timeval is
101       S : long;
102       F : Duration;
103
104    begin
105       S := long (Long_Long_Integer (D));
106       F := D - Duration (S);
107
108       --  If F has negative value due to a round-up, adjust for positive F
109       --  value.
110
111       if F < 0.0 then
112          S := S - 1;
113          F := F + 1.0;
114       end if;
115
116       return
117         struct_timeval'
118           (tv_sec => S,
119            tv_usec => long (Long_Long_Integer (F * 10#1#E6)));
120    end To_Timeval;
121
122    -------------------
123    -- clock_gettime --
124    -------------------
125
126    function clock_gettime
127      (clock_id : clockid_t;
128       tp       : access timespec)
129       return     int
130    is
131       pragma Warnings (Off, clock_id);
132
133       Result : int;
134       tv     : aliased struct_timeval;
135
136       function gettimeofday
137         (tv   : access struct_timeval;
138          tz   : System.Address := System.Null_Address)
139          return int;
140       pragma Import (C, gettimeofday, "gettimeofday");
141
142    begin
143       Result := gettimeofday (tv'Unchecked_Access);
144       tp.all := To_Timespec (To_Duration (tv));
145       return Result;
146    end clock_gettime;
147
148    -----------------
149    -- sched_yield --
150    -----------------
151
152    --  AIX Thread does not have sched_yield;
153
154    function sched_yield return int is
155       procedure pthread_yield;
156       pragma Import (C, pthread_yield, "sched_yield");
157    begin
158       pthread_yield;
159       return 0;
160    end sched_yield;
161
162    --------------------
163    -- Get_Stack_Base --
164    --------------------
165
166    function Get_Stack_Base (thread : pthread_t) return Address is
167       pragma Warnings (Off, thread);
168    begin
169       return Null_Address;
170    end Get_Stack_Base;
171
172    --------------------------
173    -- PTHREAD_PRIO_INHERIT --
174    --------------------------
175
176    AIX_Version : Integer := 0;
177    --  AIX version in the form xy for AIX version x.y (0 means not set)
178
179    SYS_NMLN : constant := 32;
180    --  AIX system constant used to define utsname, see sys/utsname.h
181
182    subtype String_NMLN is String (1 .. SYS_NMLN);
183
184    type utsname is record
185       sysname    : String_NMLN;
186       nodename   : String_NMLN;
187       release    : String_NMLN;
188       version    : String_NMLN;
189       machine    : String_NMLN;
190       procserial : String_NMLN;
191    end record;
192    pragma Convention (C, utsname);
193
194    procedure uname (name : out utsname);
195    pragma Import (C, uname);
196
197    function PTHREAD_PRIO_INHERIT return int is
198       name : utsname;
199
200       function Val (C : Character) return Integer;
201       --  Transform a numeric character ('0' .. '9') to an integer
202
203       ---------
204       -- Val --
205       ---------
206
207       function Val (C : Character) return Integer is
208       begin
209          return Character'Pos (C) - Character'Pos ('0');
210       end Val;
211
212    --  Start of processing for PTHREAD_PRIO_INHERIT
213
214    begin
215       if AIX_Version = 0 then
216
217          --  Set AIX_Version
218
219          uname (name);
220          AIX_Version := Val (name.version (1)) * 10 + Val (name.release (1));
221       end if;
222
223       if AIX_Version < 53 then
224
225          --  Under AIX < 5.3, PTHREAD_PRIO_INHERIT is defined as 0 in pthread.h
226
227          return 0;
228
229       else
230          --  Under AIX >= 5.3, PTHREAD_PRIO_INHERIT is defined as 3
231
232          return 3;
233       end if;
234    end PTHREAD_PRIO_INHERIT;
235
236 end System.OS_Interface;