]>
Commit | Line | Data |
---|---|---|
c470d7c9 AC |
1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3084fecd | 3 | -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS -- |
c470d7c9 AC |
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 | -- -- | |
cccef051 | 9 | -- Copyright (C) 1999-2023, Free Software Foundation, Inc. -- |
c470d7c9 AC |
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- -- | |
748086b7 JJ |
13 | -- ware Foundation; either version 3, or (at your option) any later ver- -- |
14 | -- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- | |
c470d7c9 | 15 | -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- |
748086b7 JJ |
16 | -- or FITNESS FOR A PARTICULAR PURPOSE. -- |
17 | -- -- | |
18 | -- As a special exception under Section 7 of GPL version 3, you are granted -- | |
19 | -- additional permissions described in the GCC Runtime Library Exception, -- | |
20 | -- version 3.1, as published by the Free Software Foundation. -- | |
21 | -- -- | |
22 | -- You should have received a copy of the GNU General Public License and -- | |
23 | -- a copy of the GCC Runtime Library Exception along with this program; -- | |
24 | -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- | |
25 | -- <http://www.gnu.org/licenses/>. -- | |
c470d7c9 AC |
26 | -- -- |
27 | -- GNARL was developed by the GNARL team at Florida State University. -- | |
28 | -- Extensive contributions were provided by Ada Core Technologies, Inc. -- | |
29 | -- -- | |
30 | ------------------------------------------------------------------------------ | |
31 | ||
32 | -- This is a Darwin Threads version of this package | |
33 | ||
6cf7eae6 | 34 | with Interfaces.C.Extensions; |
c470d7c9 | 35 | |
6cf7eae6 | 36 | package body System.OS_Interface is |
c470d7c9 AC |
37 | use Interfaces.C; |
38 | ||
39 | ----------------- | |
40 | -- To_Duration -- | |
41 | ----------------- | |
42 | ||
43 | function To_Duration (TS : timespec) return Duration is | |
44 | begin | |
45 | return Duration (TS.tv_sec) + Duration (TS.tv_nsec) / 10#1#E9; | |
46 | end To_Duration; | |
47 | ||
ec946d18 AC |
48 | ------------------------ |
49 | -- To_Target_Priority -- | |
50 | ------------------------ | |
51 | ||
52 | function To_Target_Priority | |
53 | (Prio : System.Any_Priority) return Interfaces.C.int | |
54 | is | |
55 | begin | |
56 | return Interfaces.C.int (Prio); | |
57 | end To_Target_Priority; | |
58 | ||
c470d7c9 AC |
59 | ----------------- |
60 | -- To_Timespec -- | |
61 | ----------------- | |
62 | ||
63 | function To_Timespec (D : Duration) return timespec is | |
64 | S : time_t; | |
65 | F : Duration; | |
66 | ||
67 | begin | |
68 | S := time_t (Long_Long_Integer (D)); | |
69 | F := D - Duration (S); | |
70 | ||
71 | -- If F has negative value due to a round-up, adjust for positive F | |
72 | -- value. | |
73 | ||
74 | if F < 0.0 then | |
75 | S := S - 1; | |
76 | F := F + 1.0; | |
77 | end if; | |
78 | ||
79 | return timespec'(tv_sec => S, | |
4f64abad | 80 | tv_nsec => long (Long_Long_Integer (F * 10#1#E9))); |
c470d7c9 AC |
81 | end To_Timespec; |
82 | ||
c470d7c9 AC |
83 | ------------------- |
84 | -- clock_gettime -- | |
85 | ------------------- | |
86 | ||
87 | function clock_gettime | |
88 | (clock_id : clockid_t; | |
89 | tp : access timespec) return int | |
90 | is | |
91 | pragma Unreferenced (clock_id); | |
a7194bfe | 92 | |
cbae498b | 93 | -- Darwin Threads don't have clock_gettime, so use gettimeofday |
a7194bfe EB |
94 | |
95 | use Interfaces; | |
96 | ||
6cf7eae6 AC |
97 | type timeval is array (1 .. 3) of C.long; |
98 | -- The timeval array is sized to contain long_long sec and long usec. | |
99 | -- If long_long'Size = long'Size then it will be overly large but that | |
100 | -- won't effect the implementation since it's not accessed directly. | |
a7194bfe EB |
101 | |
102 | procedure timeval_to_duration | |
103 | (T : not null access timeval; | |
6cf7eae6 | 104 | sec : not null access C.Extensions.long_long; |
a7194bfe EB |
105 | usec : not null access C.long); |
106 | pragma Import (C, timeval_to_duration, "__gnat_timeval_to_duration"); | |
107 | ||
108 | Micro : constant := 10**6; | |
6cf7eae6 | 109 | sec : aliased C.Extensions.long_long; |
a7194bfe EB |
110 | usec : aliased C.long; |
111 | TV : aliased timeval; | |
c470d7c9 | 112 | Result : int; |
c470d7c9 AC |
113 | |
114 | function gettimeofday | |
a7194bfe EB |
115 | (Tv : access timeval; |
116 | Tz : System.Address := System.Null_Address) return int; | |
c470d7c9 AC |
117 | pragma Import (C, gettimeofday, "gettimeofday"); |
118 | ||
119 | begin | |
a7194bfe EB |
120 | Result := gettimeofday (TV'Access, System.Null_Address); |
121 | pragma Assert (Result = 0); | |
122 | timeval_to_duration (TV'Access, sec'Access, usec'Access); | |
123 | tp.all := To_Timespec (Duration (sec) + Duration (usec) / Micro); | |
c470d7c9 AC |
124 | return Result; |
125 | end clock_gettime; | |
126 | ||
ed09416f AC |
127 | ------------------ |
128 | -- clock_getres -- | |
129 | ------------------ | |
130 | ||
131 | function clock_getres | |
132 | (clock_id : clockid_t; | |
133 | res : access timespec) return int | |
134 | is | |
135 | pragma Unreferenced (clock_id); | |
136 | ||
137 | -- Darwin Threads don't have clock_getres. | |
138 | ||
139 | Nano : constant := 10**9; | |
140 | nsec : int := 0; | |
141 | Result : int := -1; | |
142 | ||
143 | function clock_get_res return int; | |
144 | pragma Import (C, clock_get_res, "__gnat_clock_get_res"); | |
145 | ||
146 | begin | |
147 | nsec := clock_get_res; | |
148 | res.all := To_Timespec (Duration (0.0) + Duration (nsec) / Nano); | |
149 | ||
150 | if nsec > 0 then | |
151 | Result := 0; | |
152 | end if; | |
153 | ||
154 | return Result; | |
155 | end clock_getres; | |
156 | ||
c470d7c9 AC |
157 | ----------------- |
158 | -- sched_yield -- | |
159 | ----------------- | |
160 | ||
161 | function sched_yield return int is | |
162 | procedure sched_yield_base (arg : System.Address); | |
163 | pragma Import (C, sched_yield_base, "pthread_yield_np"); | |
164 | ||
165 | begin | |
166 | sched_yield_base (System.Null_Address); | |
167 | return 0; | |
168 | end sched_yield; | |
169 | ||
170 | ------------------ | |
171 | -- pthread_init -- | |
172 | ------------------ | |
173 | ||
174 | procedure pthread_init is | |
175 | begin | |
176 | null; | |
177 | end pthread_init; | |
178 | ||
8016e567 PT |
179 | -------------------- |
180 | -- Get_Stack_Base -- | |
181 | -------------------- | |
c470d7c9 AC |
182 | |
183 | function Get_Stack_Base (thread : pthread_t) return Address is | |
184 | pragma Unreferenced (thread); | |
185 | begin | |
186 | return System.Null_Address; | |
187 | end Get_Stack_Base; | |
188 | ||
189 | end System.OS_Interface; |