d: Merge upstream dmd, druntime 4c18eed967, phobos d945686a4.
[official-gcc.git] / libphobos / libdruntime / core / sys / posix / sys / wait.d
blobf6b0674a3b161dc5a5769cb8d56911647c5609fb
1 /**
2 * D header file for POSIX.
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly, Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
10 /* Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
15 module core.sys.posix.sys.wait;
17 import core.sys.posix.config;
18 public import core.sys.posix.sys.types; // for id_t, pid_t
19 public import core.sys.posix.signal; // for siginfo_t (XSI)
20 //public import core.sys.posix.resource; // for rusage (XSI)
22 version (OSX)
23 version = Darwin;
24 else version (iOS)
25 version = Darwin;
26 else version (TVOS)
27 version = Darwin;
28 else version (WatchOS)
29 version = Darwin;
31 version (Posix):
32 extern (C) nothrow @nogc:
35 // Required
38 WNOHANG
39 WUNTRACED
42 version (linux)
44 enum WNOHANG = 1;
45 enum WUNTRACED = 2;
47 private
49 enum __W_CONTINUED = 0xFFFF;
52 else version (Darwin)
54 enum WNOHANG = 1;
55 enum WUNTRACED = 2;
57 private
59 enum _WSTOPPED = 0x7F; // octal 0177
62 else version (FreeBSD)
64 enum WNOHANG = 1;
65 enum WUNTRACED = 2;
67 private
69 enum _WSTOPPED = 0x7F; // octal 0177
70 enum __W_CONTINUED = 0x13;
73 else version (NetBSD)
75 enum WNOHANG = 1;
76 enum WUNTRACED = 2;
78 private
80 enum _WSTOPPED = 0x7F; // octal 0177
83 else version (OpenBSD)
85 enum WNOHANG = 1;
86 enum WUNTRACED = 2;
88 private
90 enum _WSTOPPED = 0x7F; // octal 0177
91 enum _WCONTINUED = 0xFFFF; // octal 0177777
94 else version (DragonFlyBSD)
96 enum WNOHANG = 1;
97 enum WUNTRACED = 2;
99 private
101 enum _WSTOPPED = 0x7F; // octal 0177
104 else version (Solaris)
106 enum WNOHANG = 64;
107 enum WUNTRACED = 4;
109 else
111 static assert(false, "Unsupported platform");
115 WEXITSTATUS
116 WIFCONTINUED
117 WIFEXITED
118 WIFSIGNALED
119 WIFSTOPPED
120 WSTOPSIG
121 WTERMSIG
124 version (CRuntime_Glibc)
126 @safe pure:
128 private
130 extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
134 // NOTE: These macros assume __USE_MISC is not defined in the relevant
135 // C headers as the parameter definition there is different and
136 // much more complicated.
138 extern (D) int WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
139 extern (D) int WIFCONTINUED( int status ) { return status == __W_CONTINUED; }
140 extern (D) bool WIFEXITED( int status ) { return __WTERMSIG( status ) == 0; }
141 extern (D) bool WIFSIGNALED( int status )
143 return ( cast(byte) ( ( status & 0x7F ) + 1 ) >> 1 ) > 0;
145 extern (D) bool WIFSTOPPED( int status ) { return ( status & 0xFF ) == 0x7F; }
146 extern (D) int WSTOPSIG( int status ) { return WEXITSTATUS( status ); }
147 extern (D) int WTERMSIG( int status ) { return status & 0x7F; }
149 else version (Darwin)
151 @safe pure:
153 extern (D) int _WSTATUS(int status) { return (status & 0x7F); }
154 extern (D) int WEXITSTATUS( int status ) { return (status >> 8); }
155 extern (D) int WIFCONTINUED( int status ) { return status == 0x13; }
156 extern (D) bool WIFEXITED( int status ) { return _WSTATUS(status) == 0; }
157 extern (D) bool WIFSIGNALED( int status )
159 return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
161 extern (D) bool WIFSTOPPED( int status ) { return _WSTATUS( status ) == _WSTOPPED; }
162 extern (D) int WSTOPSIG( int status ) { return status >> 8; }
163 extern (D) int WTERMSIG( int status ) { return _WSTATUS( status ); }
165 else version (FreeBSD)
167 @safe pure:
169 extern (D) int _WSTATUS(int status) { return (status & 0x7F); }
170 extern (D) int WEXITSTATUS( int status ) { return (status >> 8); }
171 extern (D) int WIFCONTINUED( int status ) { return status == 0x13; }
172 extern (D) bool WIFEXITED( int status ) { return _WSTATUS(status) == 0; }
173 extern (D) bool WIFSIGNALED( int status )
175 return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
177 extern (D) bool WIFSTOPPED( int status ) { return _WSTATUS( status ) == _WSTOPPED; }
178 extern (D) int WSTOPSIG( int status ) { return status >> 8; }
179 extern (D) int WTERMSIG( int status ) { return _WSTATUS( status ); }
181 else version (NetBSD)
183 @safe pure:
185 extern (D) int _WSTATUS(int status) { return (status & 0x7F); }
186 extern (D) int WEXITSTATUS( int status ) { return (status >> 8); }
187 extern (D) int WIFCONTINUED( int status ) { return status == 0x13; }
188 extern (D) bool WIFEXITED( int status ) { return _WSTATUS(status) == 0; }
189 extern (D) bool WIFSIGNALED( int status )
191 return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
193 extern (D) bool WIFSTOPPED( int status ) { return _WSTATUS( status ) == _WSTOPPED; }
194 extern (D) int WSTOPSIG( int status ) { return status >> 8; }
195 extern (D) int WTERMSIG( int status ) { return _WSTATUS( status ); }
197 else version (OpenBSD)
199 @safe pure:
201 extern (D) int _WSTATUS(int status) { return (status & 0x7F); }
202 extern (D) int WEXITSTATUS(int status) { return (status >> 8) & 0xFF; }
203 extern (D) int WIFCONTINUED(int status) { return (status & _WCONTINUED) == _WCONTINUED; }
204 extern (D) bool WIFEXITED(int status) { return _WSTATUS(status) == 0; }
205 extern (D) bool WIFSIGNALED(int status)
207 return _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0;
209 extern (D) bool WIFSTOPPED(int status) { return (status & 0xFF) == _WSTOPPED; }
210 extern (D) int WSTOPSIG(int status) { return (status >> 8) & 0xFF; }
211 extern (D) int WTERMSIG(int status) { return _WSTATUS(status); }
213 else version (DragonFlyBSD)
215 @safe pure:
217 extern (D) int _WSTATUS(int status) { return (status & 0x7F); }
218 extern (D) int WEXITSTATUS( int status ) { return (status >> 8); }
219 extern (D) int WIFCONTINUED( int status ) { return status == 0x13; }
220 extern (D) bool WIFEXITED( int status ) { return _WSTATUS(status) == 0; }
221 extern (D) bool WIFSIGNALED( int status )
223 return _WSTATUS( status ) != _WSTOPPED && _WSTATUS( status ) != 0;
225 extern (D) bool WIFSTOPPED( int status ) { return _WSTATUS( status ) == _WSTOPPED; }
226 extern (D) int WSTOPSIG( int status ) { return status >> 8; }
227 extern (D) int WTERMSIG( int status ) { return _WSTATUS( status ); }
229 else version (Solaris)
231 @safe pure:
233 extern (D) int WEXITSTATUS(int status) { return (status >> 8) & 0xff; }
234 extern (D) int WIFCONTINUED(int status) { return (status & 0xffff) == 0xffff; }
235 extern (D) bool WIFEXITED(int status) { return (status & 0xff) == 0; }
236 extern (D) bool WIFSIGNALED(int status) { return (status & 0xff) > 0 && (status & 0xff00) == 0; }
237 extern (D) bool WIFSTOPPED(int status) { return (status & 0xff) == 0x7f && (status & 0xff00) != 0; }
238 extern (D) int WSTOPSIG(int status) { return (status >> 8) & 0x7f; }
239 extern (D) int WTERMSIG(int status) { return (status & 0x7f); }
241 else version (CRuntime_Bionic)
243 @safe pure:
244 extern (D) int WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
245 extern (D) bool WIFEXITED( int status ) { return WTERMSIG(status) == 0; }
246 extern (D) bool WIFSIGNALED( int status ) { return WTERMSIG(status + 1) >= 2; }
247 extern (D) bool WIFSTOPPED( int status ) { return WTERMSIG(status) == 0x7F; }
248 extern (D) int WSTOPSIG( int status ) { return WEXITSTATUS(status); }
249 extern (D) int WTERMSIG( int status ) { return status & 0x7F; }
251 else version (CRuntime_Musl)
253 @safe pure:
254 extern (D) int WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
255 extern (D) int WIFCONTINUED( int status ) { return status == 0xffff; }
256 extern (D) bool WIFEXITED( int status ) { return WTERMSIG( status ) == 0; }
257 extern (D) bool WIFSIGNALED( int status ) { return (status&0xffff)-1U < 0xffU; }
258 extern (D) bool WIFSTOPPED( int status ) { return cast(short)(((status&0xffff)*0x10001)>>8) > 0x7f00; }
259 extern (D) int WTERMSIG( int status ) { return status & 0x7F; }
260 alias WEXITSTATUS WSTOPSIG;
262 else version (CRuntime_UClibc)
264 @safe pure:
266 private
268 extern (D) int __WTERMSIG( int status ) { return status & 0x7F; }
272 // NOTE: These macros assume __USE_BSD is not defined in the relevant
273 // C headers as the parameter definition there is different and
274 // much more complicated.
276 extern (D) int WEXITSTATUS( int status ) { return ( status & 0xFF00 ) >> 8; }
277 extern (D) int WIFCONTINUED( int status ) { return status == __W_CONTINUED; }
278 extern (D) bool WIFEXITED( int status ) { return __WTERMSIG( status ) == 0; }
279 extern (D) bool WIFSIGNALED( int status )
281 return ( cast(ulong) ( ( status & 0xffff ) - 1U ) >> 1 ) < 0xffU;
283 version (MIPS32)
285 extern (D) bool WIFSTOPPED( int status ) { return ( status & 0xFF ) == 0x7F; }
287 else
289 extern (D) bool WIFSTOPPED( int status ) { return ( status & 0xFF ) == 0x7F && ( status & 0xFF00 ); }
291 extern (D) int WSTOPSIG( int status ) { return WEXITSTATUS( status ); }
292 extern (D) int WTERMSIG( int status ) { return status & 0x7F; }
294 else
296 static assert(false, "Unsupported platform");
300 pid_t wait(int*);
301 pid_t waitpid(pid_t, int*, int);
304 pid_t wait(int*);
305 pid_t waitpid(pid_t, int*, int);
308 // XOpen (XSI)
311 WEXITED
312 WSTOPPED
313 WCONTINUED
314 WNOWAIT
316 enum idtype_t
318 P_ALL,
319 P_PID,
320 P_PGID
324 version (linux)
326 enum WEXITED = 4;
327 enum WSTOPPED = 2;
328 enum WCONTINUED = 8;
329 enum WNOWAIT = 0x01000000;
331 enum idtype_t
333 P_ALL,
334 P_PID,
335 P_PGID
338 else version (Darwin)
340 enum WEXITED = 0x00000004;
341 enum WSTOPPED = 0x00000008;
342 enum WCONTINUED = 0x00000010;
343 enum WNOWAIT = 0x00000020;
345 enum idtype_t
347 P_ALL,
348 P_PID,
349 P_PGID
352 else version (FreeBSD)
354 enum WSTOPPED = WUNTRACED;
355 enum WCONTINUED = 4;
356 enum WNOWAIT = 8;
357 enum WEXITED = 16;
358 enum WTRAPPED = 32;
360 enum idtype_t
362 P_UID,
363 P_GID,
364 P_SID,
365 P_JAILID,
366 P_PID,
367 P_PPID,
368 P_PGID,
369 P_CID,
370 P_ALL,
371 P_LWPID,
372 P_TASKID,
373 P_PROJID,
374 P_POOLID,
375 P_CTID,
376 P_CPUID,
377 P_PSETID
380 else version (NetBSD)
382 enum WSTOPPED = WUNTRACED;
383 //enum WCONTINUED = 4;
384 enum WNOWAIT = 0x00010000;
386 else version (OpenBSD)
388 enum WCONTINUED = 8;
389 enum WSTOPPED = WUNTRACED;
390 enum WNOWAIT = 16;
392 enum idtype_t
394 P_ALL,
395 P_PID,
396 P_PGID
399 else version (DragonFlyBSD)
401 enum WSTOPPED = WUNTRACED;
402 enum WCONTINUED = 4;
403 enum WNOWAIT = 8;
405 else version (Solaris)
407 enum WEXITED = 1;
408 enum WTRAPPED = 2;
409 enum WSTOPPED = WUNTRACED;
410 enum WCONTINUED = 8;
411 enum WNOWAIT = 128;
413 enum idtype_t
415 P_PID, /* A process identifier. */
416 P_PPID, /* A parent process identifier. */
417 P_PGID, /* A process group (job control group) */
418 /* identifier. */
419 P_SID, /* A session identifier. */
420 P_CID, /* A scheduling class identifier. */
421 P_UID, /* A user identifier. */
422 P_GID, /* A group identifier. */
423 P_ALL, /* All processes. */
424 P_LWPID, /* An LWP identifier. */
425 P_TASKID, /* A task identifier. */
426 P_PROJID, /* A project identifier. */
427 P_POOLID, /* A pool identifier. */
428 P_ZONEID, /* A zone identifier. */
429 P_CTID, /* A (process) contract identifier. */
430 P_CPUID, /* CPU identifier. */
431 P_PSETID, /* Processor set identifier */
434 else
436 static assert(false, "Unsupported platform");
440 int waitid(idtype_t, id_t, siginfo_t*, int);
443 version (CRuntime_Glibc)
445 int waitid(idtype_t, id_t, siginfo_t*, int);
447 else version (Darwin)
449 int waitid(idtype_t, id_t, siginfo_t*, int);
451 else version (FreeBSD)
453 int waitid(idtype_t, id_t, siginfo_t*, int);
455 else version (NetBSD)
458 else version (OpenBSD)
460 int waitid(idtype_t, id_t, siginfo_t*, int);
462 else version (DragonFlyBSD)
465 else version (Solaris)
467 int waitid(idtype_t, id_t, siginfo_t*, int);
469 else version (CRuntime_Bionic)
471 int waitid(idtype_t, id_t, siginfo_t*, int);
473 else version (CRuntime_Musl)
475 int waitid(idtype_t, id_t, siginfo_t*, int);
477 else version (CRuntime_UClibc)
479 int waitid(idtype_t, id_t, siginfo_t*, int);
481 else
483 static assert(false, "Unsupported platform");