OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / ada / 5oosinte.adb
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 --                                  B o d y                                 --
8 --                                                                          --
9 --                                                                          --
10 --            Copyright (C) 1991-2002 Florida State University              --
11 --                                                                          --
12 -- GNARL is free software; you can  redistribute it  and/or modify it under --
13 -- terms of the  GNU General Public License as published  by the Free Soft- --
14 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
15 -- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
16 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
17 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
18 -- for  more details.  You should have  received  a copy of the GNU General --
19 -- Public License  distributed with GNARL; see file COPYING.  If not, write --
20 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
21 -- MA 02111-1307, USA.                                                      --
22 --                                                                          --
23 -- As a special exception,  if other files  instantiate  generics from this --
24 -- unit, or you link  this unit with other files  to produce an executable, --
25 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
26 -- covered  by the  GNU  General  Public  License.  This exception does not --
27 -- however invalidate  any other reasons why  the executable file  might be --
28 -- covered by the  GNU Public License.                                      --
29 --                                                                          --
30 -- GNARL was developed by the GNARL team at Florida State University. It is --
31 -- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
32 -- State University (http://www.gnat.com).                                  --
33 --                                                                          --
34 ------------------------------------------------------------------------------
35
36 --  This is the OS/2 version of this package
37
38 pragma Polling (Off);
39 --  Turn off polling, we do not want ATC polling to take place during
40 --  tasking operations. It causes infinite loops and other problems.
41
42 with Interfaces.OS2Lib.Errors;
43 with Interfaces.OS2Lib.Synchronization;
44
45 package body System.OS_Interface is
46
47    use Interfaces;
48    use Interfaces.OS2Lib;
49    use Interfaces.OS2Lib.Synchronization;
50    use Interfaces.OS2Lib.Errors;
51
52    -----------
53    -- Yield --
54    -----------
55
56    --  Give up the remainder of the time-slice and yield the processor
57    --  to other threads of equal priority. Yield will return immediately
58    --  without giving up the current time-slice when the only threads
59    --  that are ready have a lower priority.
60
61    --  ???  Just giving up the current time-slice seems not to be enough
62    --  to get the thread to the end of the ready queue if OS/2 does use
63    --  a queue at all. As a partial work-around, we give up two time-slices.
64
65    --  This is the best we can do now, and at least is sufficient for passing
66    --  the ACVC 2.0.1 Annex D tests.
67
68    procedure Yield is
69    begin
70       Delay_For (0);
71       Delay_For (0);
72    end Yield;
73
74    ---------------
75    -- Delay_For --
76    ---------------
77
78    procedure Delay_For (Period : in Duration_In_Millisec) is
79       Result : APIRET;
80
81    begin
82       pragma Assert (Period >= 0, "GNULLI---Delay_For: negative argument");
83
84       --  ??? DosSleep is not the appropriate function for a delay in real
85       --  time. It only gives up some number of scheduled time-slices.
86       --  Use a timer instead or block for some semaphore with a time-out.
87       Result := DosSleep (ULONG (Period));
88
89       if Result = ERROR_TS_WAKEUP then
90
91          --  Do appropriate processing for interrupted sleep
92          --  Can we raise an exception here?
93
94          null;
95       end if;
96
97       pragma Assert (Result = NO_ERROR, "GNULLI---Error in Delay_For");
98    end Delay_For;
99
100    -----------
101    -- Clock --
102    -----------
103
104    function Clock return Duration is
105
106       --  Implement conversion from tick count to Duration
107       --  using fixed point arithmetic. The frequency of
108       --  the Intel 8254 timer chip is 18.2 * 2**16 Hz.
109
110       Tick_Duration : constant := 1.0 / (18.2 * 2**16);
111       Tick_Count    : aliased QWORD;
112
113    begin
114
115       --  Read nr of clock ticks since boot time
116       Must_Not_Fail (DosTmrQueryTime (Tick_Count'Access));
117
118       return Tick_Count * Tick_Duration;
119    end Clock;
120
121 end System.OS_Interface;