OSDN Git Service

2008-04-08 Ed Schonberg <schonberg@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-osinte-vxworks.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 the VxWorks version
35
36 --  This package encapsulates all direct interfaces to OS services that are
37 --  needed by children of System.
38
39 pragma Polling (Off);
40 --  Turn off polling, we do not want ATC polling to take place during tasking
41 --  operations. It causes infinite loops and other problems.
42
43 package body System.OS_Interface is
44
45    use type Interfaces.C.int;
46
47    Low_Priority : constant := 255;
48    --  VxWorks native (default) lowest scheduling priority
49
50    ----------
51    -- kill --
52    ----------
53
54    function kill (pid : t_id; sig : Signal) return int is
55    begin
56       return System.VxWorks.Ext.kill (pid, int (sig));
57    end kill;
58
59    -------------
60    -- sigwait --
61    -------------
62
63    function sigwait
64      (set : access sigset_t;
65       sig : access Signal) return int
66    is
67       Result : int;
68
69       function sigwaitinfo
70         (set : access sigset_t; sigvalue : System.Address) return int;
71       pragma Import (C, sigwaitinfo, "sigwaitinfo");
72
73    begin
74       Result := sigwaitinfo (set, System.Null_Address);
75
76       if Result /= -1 then
77          sig.all := Signal (Result);
78          return 0;
79       else
80          sig.all := 0;
81          return errno;
82       end if;
83    end sigwait;
84
85    -----------------
86    -- To_Duration --
87    -----------------
88
89    function To_Duration (TS : timespec) return Duration is
90    begin
91       return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9;
92    end To_Duration;
93
94    -----------------
95    -- To_Timespec --
96    -----------------
97
98    function To_Timespec (D : Duration) return timespec is
99       S : time_t;
100       F : Duration;
101
102    begin
103       S := time_t (Long_Long_Integer (D));
104       F := D - Duration (S);
105
106       --  If F is negative due to a round-up, adjust for positive F value
107
108       if F < 0.0 then
109          S := S - 1;
110          F := F + 1.0;
111       end if;
112
113       return timespec'(ts_sec  => S,
114                        ts_nsec => long (Long_Long_Integer (F * 10#1#E9)));
115    end To_Timespec;
116
117    -------------------------
118    -- To_VxWorks_Priority --
119    -------------------------
120
121    function To_VxWorks_Priority (Priority : int) return int is
122    begin
123       return Low_Priority - Priority;
124    end To_VxWorks_Priority;
125
126    --------------------
127    -- To_Clock_Ticks --
128    --------------------
129
130    --  ??? - For now, we'll always get the system clock rate since it is
131    --  allowed to be changed during run-time in VxWorks. A better method would
132    --  be to provide an operation to set it that so we can always know its
133    --  value.
134
135    --  Another thing we should probably allow for is a resultant tick count
136    --  greater than int'Last. This should probably be a procedure with two
137    --  output parameters, one in the range 0 .. int'Last, and another
138    --  representing the overflow count.
139
140    function To_Clock_Ticks (D : Duration) return int is
141       Ticks          : Long_Long_Integer;
142       Rate_Duration  : Duration;
143       Ticks_Duration : Duration;
144
145    begin
146       if D < 0.0 then
147          return -1;
148       end if;
149
150       --  Ensure that the duration can be converted to ticks
151       --  at the current clock tick rate without overflowing.
152
153       Rate_Duration := Duration (sysClkRateGet);
154
155       if D > (Duration'Last / Rate_Duration) then
156          Ticks := Long_Long_Integer (int'Last);
157       else
158          Ticks_Duration := D * Rate_Duration;
159          Ticks := Long_Long_Integer (Ticks_Duration);
160
161          if Ticks_Duration > Duration (Ticks) then
162             Ticks := Ticks + 1;
163          end if;
164
165          if Ticks > Long_Long_Integer (int'Last) then
166             Ticks := Long_Long_Integer (int'Last);
167          end if;
168       end if;
169
170       return int (Ticks);
171    end To_Clock_Ticks;
172
173 end System.OS_Interface;