annotate gcc/ada/libgnat/s-osprim__x32.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- S Y S T E M . O S _ P R I M I T I V E S --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2013-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNARL is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNARL was developed by the GNARL team at Florida State University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies, Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 -- This version is for Linux/x32
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 package body System.OS_Primitives is
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 -- ??? These definitions are duplicated from System.OS_Interface
kono
parents:
diff changeset
37 -- because we don't want to depend on any package. Consider removing
kono
parents:
diff changeset
38 -- these declarations in System.OS_Interface and move these ones in
kono
parents:
diff changeset
39 -- the spec.
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 type time_t is new Long_Long_Integer;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 type timespec is record
kono
parents:
diff changeset
44 tv_sec : time_t;
kono
parents:
diff changeset
45 tv_nsec : Long_Long_Integer;
kono
parents:
diff changeset
46 end record;
kono
parents:
diff changeset
47 pragma Convention (C, timespec);
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 function nanosleep (rqtp, rmtp : not null access timespec) return Integer;
kono
parents:
diff changeset
50 pragma Import (C, nanosleep, "nanosleep");
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 -----------
kono
parents:
diff changeset
53 -- Clock --
kono
parents:
diff changeset
54 -----------
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 function Clock return Duration is
kono
parents:
diff changeset
57 type timeval is array (1 .. 2) of Long_Long_Integer;
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 procedure timeval_to_duration
kono
parents:
diff changeset
60 (T : not null access timeval;
kono
parents:
diff changeset
61 sec : not null access Long_Integer;
kono
parents:
diff changeset
62 usec : not null access Long_Integer);
kono
parents:
diff changeset
63 pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration");
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 Micro : constant := 10**6;
kono
parents:
diff changeset
66 sec : aliased Long_Integer;
kono
parents:
diff changeset
67 usec : aliased Long_Integer;
kono
parents:
diff changeset
68 TV : aliased timeval;
kono
parents:
diff changeset
69 Result : Integer;
kono
parents:
diff changeset
70 pragma Unreferenced (Result);
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 function gettimeofday
kono
parents:
diff changeset
73 (Tv : access timeval;
kono
parents:
diff changeset
74 Tz : System.Address := System.Null_Address) return Integer;
kono
parents:
diff changeset
75 pragma Import (C, gettimeofday, "gettimeofday");
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 begin
kono
parents:
diff changeset
78 -- The return codes for gettimeofday are as follows (from man pages):
kono
parents:
diff changeset
79 -- EPERM settimeofday is called by someone other than the superuser
kono
parents:
diff changeset
80 -- EINVAL Timezone (or something else) is invalid
kono
parents:
diff changeset
81 -- EFAULT One of tv or tz pointed outside accessible address space
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 -- None of these codes signal a potential clock skew, hence the return
kono
parents:
diff changeset
84 -- value is never checked.
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 Result := gettimeofday (TV'Access, System.Null_Address);
kono
parents:
diff changeset
87 timeval_to_duration (TV'Access, sec'Access, usec'Access);
kono
parents:
diff changeset
88 return Duration (sec) + Duration (usec) / Micro;
kono
parents:
diff changeset
89 end Clock;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 -----------------
kono
parents:
diff changeset
92 -- To_Timespec --
kono
parents:
diff changeset
93 -----------------
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 function To_Timespec (D : Duration) return timespec;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 function To_Timespec (D : Duration) return timespec is
kono
parents:
diff changeset
98 S : time_t;
kono
parents:
diff changeset
99 F : Duration;
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 begin
kono
parents:
diff changeset
102 S := time_t (Long_Long_Integer (D));
kono
parents:
diff changeset
103 F := D - Duration (S);
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 -- If F has negative value due to a round-up, adjust for positive F
kono
parents:
diff changeset
106 -- value.
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 if F < 0.0 then
kono
parents:
diff changeset
109 S := S - 1;
kono
parents:
diff changeset
110 F := F + 1.0;
kono
parents:
diff changeset
111 end if;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 return
kono
parents:
diff changeset
114 timespec'(tv_sec => S,
kono
parents:
diff changeset
115 tv_nsec => Long_Long_Integer (F * 10#1#E9));
kono
parents:
diff changeset
116 end To_Timespec;
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 -----------------
kono
parents:
diff changeset
119 -- Timed_Delay --
kono
parents:
diff changeset
120 -----------------
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 procedure Timed_Delay
kono
parents:
diff changeset
123 (Time : Duration;
kono
parents:
diff changeset
124 Mode : Integer)
kono
parents:
diff changeset
125 is
kono
parents:
diff changeset
126 Request : aliased timespec;
kono
parents:
diff changeset
127 Remaind : aliased timespec;
kono
parents:
diff changeset
128 Rel_Time : Duration;
kono
parents:
diff changeset
129 Abs_Time : Duration;
kono
parents:
diff changeset
130 Base_Time : constant Duration := Clock;
kono
parents:
diff changeset
131 Check_Time : Duration := Base_Time;
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 Result : Integer;
kono
parents:
diff changeset
134 pragma Unreferenced (Result);
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 begin
kono
parents:
diff changeset
137 if Mode = Relative then
kono
parents:
diff changeset
138 Rel_Time := Time;
kono
parents:
diff changeset
139 Abs_Time := Time + Check_Time;
kono
parents:
diff changeset
140 else
kono
parents:
diff changeset
141 Rel_Time := Time - Check_Time;
kono
parents:
diff changeset
142 Abs_Time := Time;
kono
parents:
diff changeset
143 end if;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 if Rel_Time > 0.0 then
kono
parents:
diff changeset
146 loop
kono
parents:
diff changeset
147 Request := To_Timespec (Rel_Time);
kono
parents:
diff changeset
148 Result := nanosleep (Request'Access, Remaind'Access);
kono
parents:
diff changeset
149 Check_Time := Clock;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 exit when Abs_Time <= Check_Time or else Check_Time < Base_Time;
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 Rel_Time := Abs_Time - Check_Time;
kono
parents:
diff changeset
154 end loop;
kono
parents:
diff changeset
155 end if;
kono
parents:
diff changeset
156 end Timed_Delay;
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 ----------------
kono
parents:
diff changeset
159 -- Initialize --
kono
parents:
diff changeset
160 ----------------
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 procedure Initialize is
kono
parents:
diff changeset
163 begin
kono
parents:
diff changeset
164 null;
kono
parents:
diff changeset
165 end Initialize;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 end System.OS_Primitives;