1 ------------------------------------------------------------------------------
3 -- GNAT RUN-TIME LIBRARY (GNARL) COMPONENTS --
5 -- S Y S T E M . O S _ I N T E R F A C E --
9 -- Copyright (C) 1991-1994, Florida State University --
10 -- Copyright (C) 1995-2010, Free Software Foundation, Inc. --
12 -- GNAT 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 3, or (at your option) any later ver- --
15 -- sion. GNAT 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. --
19 -- As a special exception under Section 7 of GPL version 3, you are granted --
20 -- additional permissions described in the GCC Runtime Library Exception, --
21 -- version 3.1, as published by the Free Software Foundation. --
23 -- You should have received a copy of the GNU General Public License and --
24 -- a copy of the GCC Runtime Library Exception along with this program; --
25 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
26 -- <http://www.gnu.org/licenses/>. --
28 -- GNARL was developed by the GNARL team at Florida State University. --
29 -- Extensive contributions were provided by Ada Core Technologies Inc. --
31 ------------------------------------------------------------------------------
33 -- This is a NT (native) version of this package
35 -- This package encapsulates all direct interfaces to OS services
36 -- that are needed by the tasking run-time (libgnarl). For non tasking
37 -- oriented services consider declaring them into system-win32.
39 -- PLEASE DO NOT add any with-clauses to this package or remove the pragma
40 -- Preelaborate. This package is designed to be a bottom-level (leaf) package.
42 with Ada
.Unchecked_Conversion
;
45 with Interfaces
.C
.Strings
;
48 package System
.OS_Interface
is
51 pragma Linker_Options
("-mthreads");
53 subtype int
is Interfaces
.C
.int
;
54 subtype long
is Interfaces
.C
.long
;
60 subtype PSZ
is Interfaces
.C
.Strings
.chars_ptr
;
62 Null_Void
: constant Win32
.PVOID
:= System
.Null_Address
;
64 -------------------------
65 -- Handles for objects --
66 -------------------------
68 subtype Thread_Id
is Win32
.HANDLE
;
74 NO_ERROR
: constant := 0;
75 FUNC_ERR
: constant := -1;
81 Max_Interrupt
: constant := 31;
82 type Signal
is new int
range 0 .. Max_Interrupt
;
83 for Signal
'Size use int
'Size;
85 SIGINT
: constant := 2; -- interrupt (Ctrl-C)
86 SIGILL
: constant := 4; -- illegal instruction (not reset)
87 SIGFPE
: constant := 8; -- floating point exception
88 SIGSEGV
: constant := 11; -- segmentation violation
89 SIGTERM
: constant := 15; -- software termination signal from kill
90 SIGBREAK
: constant := 21; -- break (Ctrl-Break)
91 SIGABRT
: constant := 22; -- used by abort, replace SIGIOT in the future
93 type sigset_t
is private;
95 type isr_address
is access procedure (sig
: int
);
96 pragma Convention
(C
, isr_address
);
98 function intr_attach
(sig
: int
; handler
: isr_address
) return long
;
99 pragma Import
(C
, intr_attach
, "signal");
101 Intr_Attach_Reset
: constant Boolean := True;
102 -- True if intr_attach is reset after an interrupt handler is called
104 procedure kill
(sig
: Signal
);
105 pragma Import
(C
, kill
, "raise");
111 type Thread_Body
is access
112 function (arg
: System
.Address
) return System
.Address
;
113 pragma Convention
(C
, Thread_Body
);
115 function Thread_Body_Access
is new
116 Ada
.Unchecked_Conversion
(System
.Address
, Thread_Body
);
118 procedure SwitchToThread
;
119 pragma Import
(Stdcall
, SwitchToThread
, "SwitchToThread");
121 function GetThreadTimes
122 (hThread
: Win32
.HANDLE
;
123 lpCreationTime
: access Long_Long_Integer;
124 lpExitTime
: access Long_Long_Integer;
125 lpKernelTime
: access Long_Long_Integer;
126 lpUserTime
: access Long_Long_Integer) return Win32
.BOOL
;
127 pragma Import
(Stdcall
, GetThreadTimes
, "GetThreadTimes");
129 -----------------------
130 -- Critical sections --
131 -----------------------
133 type CRITICAL_SECTION
is private;
135 -------------------------------------------------------------
136 -- Thread Creation, Activation, Suspension And Termination --
137 -------------------------------------------------------------
139 type PTHREAD_START_ROUTINE
is access function
140 (pThreadParameter
: Win32
.PVOID
) return Win32
.DWORD
;
141 pragma Convention
(Stdcall
, PTHREAD_START_ROUTINE
);
143 function To_PTHREAD_START_ROUTINE
is new
144 Ada
.Unchecked_Conversion
(System
.Address
, PTHREAD_START_ROUTINE
);
146 function CreateThread
147 (pThreadAttributes
: access Win32
.SECURITY_ATTRIBUTES
;
148 dwStackSize
: Win32
.DWORD
;
149 pStartAddress
: PTHREAD_START_ROUTINE
;
150 pParameter
: Win32
.PVOID
;
151 dwCreationFlags
: Win32
.DWORD
;
152 pThreadId
: access Win32
.DWORD
) return Win32
.HANDLE
;
153 pragma Import
(Stdcall
, CreateThread
, "CreateThread");
155 function BeginThreadEx
156 (pThreadAttributes
: access Win32
.SECURITY_ATTRIBUTES
;
157 dwStackSize
: Win32
.DWORD
;
158 pStartAddress
: PTHREAD_START_ROUTINE
;
159 pParameter
: Win32
.PVOID
;
160 dwCreationFlags
: Win32
.DWORD
;
161 pThreadId
: not null access Win32
.DWORD
) return Win32
.HANDLE
;
162 pragma Import
(C
, BeginThreadEx
, "_beginthreadex");
164 Debug_Process
: constant := 16#
00000001#
;
165 Debug_Only_This_Process
: constant := 16#
00000002#
;
166 Create_Suspended
: constant := 16#
00000004#
;
167 Detached_Process
: constant := 16#
00000008#
;
168 Create_New_Console
: constant := 16#
00000010#
;
170 Create_New_Process_Group
: constant := 16#
00000200#
;
172 Create_No_window
: constant := 16#
08000000#
;
174 Profile_User
: constant := 16#
10000000#
;
175 Profile_Kernel
: constant := 16#
20000000#
;
176 Profile_Server
: constant := 16#
40000000#
;
178 Stack_Size_Param_Is_A_Reservation
: constant := 16#
00010000#
;
180 function GetExitCodeThread
181 (hThread
: Win32
.HANDLE
;
182 pExitCode
: not null access Win32
.DWORD
) return Win32
.BOOL
;
183 pragma Import
(Stdcall
, GetExitCodeThread
, "GetExitCodeThread");
185 function ResumeThread
(hThread
: Win32
.HANDLE
) return Win32
.DWORD
;
186 pragma Import
(Stdcall
, ResumeThread
, "ResumeThread");
188 function SuspendThread
(hThread
: Win32
.HANDLE
) return Win32
.DWORD
;
189 pragma Import
(Stdcall
, SuspendThread
, "SuspendThread");
191 procedure ExitThread
(dwExitCode
: Win32
.DWORD
);
192 pragma Import
(Stdcall
, ExitThread
, "ExitThread");
194 procedure EndThreadEx
(dwExitCode
: Win32
.DWORD
);
195 pragma Import
(C
, EndThreadEx
, "_endthreadex");
197 function TerminateThread
198 (hThread
: Win32
.HANDLE
;
199 dwExitCode
: Win32
.DWORD
) return Win32
.BOOL
;
200 pragma Import
(Stdcall
, TerminateThread
, "TerminateThread");
202 function GetCurrentThread
return Win32
.HANDLE
;
203 pragma Import
(Stdcall
, GetCurrentThread
, "GetCurrentThread");
205 function GetCurrentProcess
return Win32
.HANDLE
;
206 pragma Import
(Stdcall
, GetCurrentProcess
, "GetCurrentProcess");
208 function GetCurrentThreadId
return Win32
.DWORD
;
209 pragma Import
(Stdcall
, GetCurrentThreadId
, "GetCurrentThreadId");
211 function TlsAlloc
return Win32
.DWORD
;
212 pragma Import
(Stdcall
, TlsAlloc
, "TlsAlloc");
214 function TlsGetValue
(dwTlsIndex
: Win32
.DWORD
) return Win32
.PVOID
;
215 pragma Import
(Stdcall
, TlsGetValue
, "TlsGetValue");
218 (dwTlsIndex
: Win32
.DWORD
; pTlsValue
: Win32
.PVOID
) return Win32
.BOOL
;
219 pragma Import
(Stdcall
, TlsSetValue
, "TlsSetValue");
221 function TlsFree
(dwTlsIndex
: Win32
.DWORD
) return Win32
.BOOL
;
222 pragma Import
(Stdcall
, TlsFree
, "TlsFree");
224 TLS_Nothing
: constant := Win32
.DWORD
'Last;
226 procedure ExitProcess
(uExitCode
: Interfaces
.C
.unsigned
);
227 pragma Import
(Stdcall
, ExitProcess
, "ExitProcess");
229 function WaitForSingleObject
230 (hHandle
: Win32
.HANDLE
;
231 dwMilliseconds
: Win32
.DWORD
) return Win32
.DWORD
;
232 pragma Import
(Stdcall
, WaitForSingleObject
, "WaitForSingleObject");
234 function WaitForSingleObjectEx
235 (hHandle
: Win32
.HANDLE
;
236 dwMilliseconds
: Win32
.DWORD
;
237 fAlertable
: Win32
.BOOL
) return Win32
.DWORD
;
238 pragma Import
(Stdcall
, WaitForSingleObjectEx
, "WaitForSingleObjectEx");
240 Wait_Infinite
: constant := Win32
.DWORD
'Last;
241 WAIT_TIMEOUT
: constant := 16#
0000_0102#
;
242 WAIT_FAILED
: constant := 16#FFFF_FFFF#
;
244 ------------------------------------
245 -- Semaphores, Events and Mutexes --
246 ------------------------------------
248 function CreateSemaphore
249 (pSemaphoreAttributes
: access Win32
.SECURITY_ATTRIBUTES
;
250 lInitialCount
: Interfaces
.C
.long
;
251 lMaximumCount
: Interfaces
.C
.long
;
252 pName
: PSZ
) return Win32
.HANDLE
;
253 pragma Import
(Stdcall
, CreateSemaphore
, "CreateSemaphoreA");
255 function OpenSemaphore
256 (dwDesiredAccess
: Win32
.DWORD
;
257 bInheritHandle
: Win32
.BOOL
;
258 pName
: PSZ
) return Win32
.HANDLE
;
259 pragma Import
(Stdcall
, OpenSemaphore
, "OpenSemaphoreA");
261 function ReleaseSemaphore
262 (hSemaphore
: Win32
.HANDLE
;
263 lReleaseCount
: Interfaces
.C
.long
;
264 pPreviousCount
: access Win32
.LONG
) return Win32
.BOOL
;
265 pragma Import
(Stdcall
, ReleaseSemaphore
, "ReleaseSemaphore");
268 (pEventAttributes
: access Win32
.SECURITY_ATTRIBUTES
;
269 bManualReset
: Win32
.BOOL
;
270 bInitialState
: Win32
.BOOL
;
271 pName
: PSZ
) return Win32
.HANDLE
;
272 pragma Import
(Stdcall
, CreateEvent
, "CreateEventA");
275 (dwDesiredAccess
: Win32
.DWORD
;
276 bInheritHandle
: Win32
.BOOL
;
277 pName
: PSZ
) return Win32
.HANDLE
;
278 pragma Import
(Stdcall
, OpenEvent
, "OpenEventA");
280 function SetEvent
(hEvent
: Win32
.HANDLE
) return Win32
.BOOL
;
281 pragma Import
(Stdcall
, SetEvent
, "SetEvent");
283 function ResetEvent
(hEvent
: Win32
.HANDLE
) return Win32
.BOOL
;
284 pragma Import
(Stdcall
, ResetEvent
, "ResetEvent");
286 function PulseEvent
(hEvent
: Win32
.HANDLE
) return Win32
.BOOL
;
287 pragma Import
(Stdcall
, PulseEvent
, "PulseEvent");
290 (pMutexAttributes
: access Win32
.SECURITY_ATTRIBUTES
;
291 bInitialOwner
: Win32
.BOOL
;
292 pName
: PSZ
) return Win32
.HANDLE
;
293 pragma Import
(Stdcall
, CreateMutex
, "CreateMutexA");
296 (dwDesiredAccess
: Win32
.DWORD
;
297 bInheritHandle
: Win32
.BOOL
;
298 pName
: PSZ
) return Win32
.HANDLE
;
299 pragma Import
(Stdcall
, OpenMutex
, "OpenMutexA");
301 function ReleaseMutex
(hMutex
: Win32
.HANDLE
) return Win32
.BOOL
;
302 pragma Import
(Stdcall
, ReleaseMutex
, "ReleaseMutex");
304 ---------------------------------------------------
305 -- Accessing properties of Threads and Processes --
306 ---------------------------------------------------
312 function SetThreadPriority
313 (hThread
: Win32
.HANDLE
;
314 nPriority
: Interfaces
.C
.int
) return Win32
.BOOL
;
315 pragma Import
(Stdcall
, SetThreadPriority
, "SetThreadPriority");
317 function GetThreadPriority
(hThread
: Win32
.HANDLE
) return Interfaces
.C
.int
;
318 pragma Import
(Stdcall
, GetThreadPriority
, "GetThreadPriority");
320 function SetPriorityClass
321 (hProcess
: Win32
.HANDLE
;
322 dwPriorityClass
: Win32
.DWORD
) return Win32
.BOOL
;
323 pragma Import
(Stdcall
, SetPriorityClass
, "SetPriorityClass");
325 procedure SetThreadPriorityBoost
326 (hThread
: Win32
.HANDLE
;
327 DisablePriorityBoost
: Win32
.BOOL
);
328 pragma Import
(Stdcall
, SetThreadPriorityBoost
, "SetThreadPriorityBoost");
330 Normal_Priority_Class
: constant := 16#
00000020#
;
331 Idle_Priority_Class
: constant := 16#
00000040#
;
332 High_Priority_Class
: constant := 16#
00000080#
;
333 Realtime_Priority_Class
: constant := 16#
00000100#
;
335 Thread_Priority_Idle
: constant := -15;
336 Thread_Priority_Lowest
: constant := -2;
337 Thread_Priority_Below_Normal
: constant := -1;
338 Thread_Priority_Normal
: constant := 0;
339 Thread_Priority_Above_Normal
: constant := 1;
340 Thread_Priority_Highest
: constant := 2;
341 Thread_Priority_Time_Critical
: constant := 15;
342 Thread_Priority_Error_Return
: constant := Interfaces
.C
.long
'Last;
346 type sigset_t
is new Interfaces
.C
.unsigned_long
;
348 type CRITICAL_SECTION
is record
349 DebugInfo
: System
.Address
;
351 LockCount
: Long_Integer;
352 RecursionCount
: Long_Integer;
353 OwningThread
: Win32
.HANDLE
;
354 -- The above three fields control entering and exiting the critical
355 -- section for the resource.
357 LockSemaphore
: Win32
.HANDLE
;
358 SpinCount
: Win32
.DWORD
;
361 end System
.OS_Interface
;