annotate gcc/ada/libgnarl/a-exetim__darwin.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 COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- A D A . E X E C U T I O N _ T I M E --
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) 2007-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT 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 -- GNAT was originally developed by the GNAT team at New York 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 is the Darwin version of this package
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with Ada.Task_Identification; use Ada.Task_Identification;
kono
parents:
diff changeset
35 with Ada.Unchecked_Conversion;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 with System.Tasking;
kono
parents:
diff changeset
38 with System.OS_Interface; use System.OS_Interface;
kono
parents:
diff changeset
39 with System.Task_Primitives.Operations; use System.Task_Primitives.Operations;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 with Interfaces.C; use Interfaces.C;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 package body Ada.Execution_Time is
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 ---------
kono
parents:
diff changeset
46 -- "+" --
kono
parents:
diff changeset
47 ---------
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 function "+"
kono
parents:
diff changeset
50 (Left : CPU_Time;
kono
parents:
diff changeset
51 Right : Ada.Real_Time.Time_Span) return CPU_Time
kono
parents:
diff changeset
52 is
kono
parents:
diff changeset
53 use type Ada.Real_Time.Time;
kono
parents:
diff changeset
54 begin
kono
parents:
diff changeset
55 return CPU_Time (Ada.Real_Time.Time (Left) + Right);
kono
parents:
diff changeset
56 end "+";
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 function "+"
kono
parents:
diff changeset
59 (Left : Ada.Real_Time.Time_Span;
kono
parents:
diff changeset
60 Right : CPU_Time) return CPU_Time
kono
parents:
diff changeset
61 is
kono
parents:
diff changeset
62 use type Ada.Real_Time.Time;
kono
parents:
diff changeset
63 begin
kono
parents:
diff changeset
64 return CPU_Time (Left + Ada.Real_Time.Time (Right));
kono
parents:
diff changeset
65 end "+";
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 ---------
kono
parents:
diff changeset
68 -- "-" --
kono
parents:
diff changeset
69 ---------
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 function "-"
kono
parents:
diff changeset
72 (Left : CPU_Time;
kono
parents:
diff changeset
73 Right : Ada.Real_Time.Time_Span) return CPU_Time
kono
parents:
diff changeset
74 is
kono
parents:
diff changeset
75 use type Ada.Real_Time.Time;
kono
parents:
diff changeset
76 begin
kono
parents:
diff changeset
77 return CPU_Time (Ada.Real_Time.Time (Left) - Right);
kono
parents:
diff changeset
78 end "-";
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 function "-"
kono
parents:
diff changeset
81 (Left : CPU_Time;
kono
parents:
diff changeset
82 Right : CPU_Time) return Ada.Real_Time.Time_Span
kono
parents:
diff changeset
83 is
kono
parents:
diff changeset
84 use type Ada.Real_Time.Time;
kono
parents:
diff changeset
85 begin
kono
parents:
diff changeset
86 return (Ada.Real_Time.Time (Left) - Ada.Real_Time.Time (Right));
kono
parents:
diff changeset
87 end "-";
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 -----------
kono
parents:
diff changeset
90 -- Clock --
kono
parents:
diff changeset
91 -----------
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 function Clock
kono
parents:
diff changeset
94 (T : Ada.Task_Identification.Task_Id :=
kono
parents:
diff changeset
95 Ada.Task_Identification.Current_Task) return CPU_Time
kono
parents:
diff changeset
96 is
kono
parents:
diff changeset
97 function Convert_Ids is new
kono
parents:
diff changeset
98 Ada.Unchecked_Conversion (Task_Id, System.Tasking.Task_Id);
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 function To_CPU_Time is
kono
parents:
diff changeset
101 new Ada.Unchecked_Conversion (Duration, CPU_Time);
kono
parents:
diff changeset
102 -- Time is equal to Duration (although it is a private type) and
kono
parents:
diff changeset
103 -- CPU_Time is equal to Time.
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 subtype integer_t is Interfaces.C.int;
kono
parents:
diff changeset
106 subtype mach_port_t is integer_t;
kono
parents:
diff changeset
107 -- Type definition for Mach.
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 type time_value_t is record
kono
parents:
diff changeset
110 seconds : integer_t;
kono
parents:
diff changeset
111 microseconds : integer_t;
kono
parents:
diff changeset
112 end record;
kono
parents:
diff changeset
113 pragma Convention (C, time_value_t);
kono
parents:
diff changeset
114 -- Mach time_value_t
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 type thread_basic_info_t is record
kono
parents:
diff changeset
117 user_time : time_value_t;
kono
parents:
diff changeset
118 system_time : time_value_t;
kono
parents:
diff changeset
119 cpu_usage : integer_t;
kono
parents:
diff changeset
120 policy : integer_t;
kono
parents:
diff changeset
121 run_state : integer_t;
kono
parents:
diff changeset
122 flags : integer_t;
kono
parents:
diff changeset
123 suspend_count : integer_t;
kono
parents:
diff changeset
124 sleep_time : integer_t;
kono
parents:
diff changeset
125 end record;
kono
parents:
diff changeset
126 pragma Convention (C, thread_basic_info_t);
kono
parents:
diff changeset
127 -- Mach structure from thread_info.h
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 THREAD_BASIC_INFO : constant := 3;
kono
parents:
diff changeset
130 THREAD_BASIC_INFO_COUNT : constant := 10;
kono
parents:
diff changeset
131 -- Flavors for basic info
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 function thread_info (Target : mach_port_t;
kono
parents:
diff changeset
134 Flavor : integer_t;
kono
parents:
diff changeset
135 Thread_Info : System.Address;
kono
parents:
diff changeset
136 Count : System.Address) return integer_t;
kono
parents:
diff changeset
137 pragma Import (C, thread_info);
kono
parents:
diff changeset
138 -- Mach call to get info on a thread
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 function pthread_mach_thread_np (Thread : pthread_t) return mach_port_t;
kono
parents:
diff changeset
141 pragma Import (C, pthread_mach_thread_np);
kono
parents:
diff changeset
142 -- Get Mach thread from posix thread
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 Result : Interfaces.C.int;
kono
parents:
diff changeset
145 Thread : pthread_t;
kono
parents:
diff changeset
146 Port : mach_port_t;
kono
parents:
diff changeset
147 Ti : thread_basic_info_t;
kono
parents:
diff changeset
148 Count : integer_t;
kono
parents:
diff changeset
149 begin
kono
parents:
diff changeset
150 if T = Ada.Task_Identification.Null_Task_Id then
kono
parents:
diff changeset
151 raise Program_Error;
kono
parents:
diff changeset
152 end if;
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 Thread := Get_Thread_Id (Convert_Ids (T));
kono
parents:
diff changeset
155 Port := pthread_mach_thread_np (Thread);
kono
parents:
diff changeset
156 pragma Assert (Port > 0);
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 Count := THREAD_BASIC_INFO_COUNT;
kono
parents:
diff changeset
159 Result := thread_info (Port, THREAD_BASIC_INFO,
kono
parents:
diff changeset
160 Ti'Address, Count'Address);
kono
parents:
diff changeset
161 pragma Assert (Result = 0);
kono
parents:
diff changeset
162 pragma Assert (Count = THREAD_BASIC_INFO_COUNT);
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 return To_CPU_Time
kono
parents:
diff changeset
165 (Duration (Ti.user_time.seconds + Ti.system_time.seconds)
kono
parents:
diff changeset
166 + Duration (Ti.user_time.microseconds
kono
parents:
diff changeset
167 + Ti.system_time.microseconds) / 1E6);
kono
parents:
diff changeset
168 end Clock;
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 --------------------------
kono
parents:
diff changeset
171 -- Clock_For_Interrupts --
kono
parents:
diff changeset
172 --------------------------
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 function Clock_For_Interrupts return CPU_Time is
kono
parents:
diff changeset
175 begin
kono
parents:
diff changeset
176 -- According to AI 0170-1, D.14(18.1/3), if Interrupt_Clocks_Supported
kono
parents:
diff changeset
177 -- is set to False the function raises Program_Error.
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 raise Program_Error;
kono
parents:
diff changeset
180 return CPU_Time_First;
kono
parents:
diff changeset
181 end Clock_For_Interrupts;
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 -----------
kono
parents:
diff changeset
184 -- Split --
kono
parents:
diff changeset
185 -----------
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 procedure Split
kono
parents:
diff changeset
188 (T : CPU_Time;
kono
parents:
diff changeset
189 SC : out Ada.Real_Time.Seconds_Count;
kono
parents:
diff changeset
190 TS : out Ada.Real_Time.Time_Span)
kono
parents:
diff changeset
191 is
kono
parents:
diff changeset
192 begin
kono
parents:
diff changeset
193 Ada.Real_Time.Split (Ada.Real_Time.Time (T), SC, TS);
kono
parents:
diff changeset
194 end Split;
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 -------------
kono
parents:
diff changeset
197 -- Time_Of --
kono
parents:
diff changeset
198 -------------
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 function Time_Of
kono
parents:
diff changeset
201 (SC : Ada.Real_Time.Seconds_Count;
kono
parents:
diff changeset
202 TS : Ada.Real_Time.Time_Span := Ada.Real_Time.Time_Span_Zero)
kono
parents:
diff changeset
203 return CPU_Time
kono
parents:
diff changeset
204 is
kono
parents:
diff changeset
205 begin
kono
parents:
diff changeset
206 return CPU_Time (Ada.Real_Time.Time_Of (SC, TS));
kono
parents:
diff changeset
207 end Time_Of;
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 end Ada.Execution_Time;