8c3b53fa4567750d9d8a8b672ed49e0995b5390b
[platform/upstream/gcc48.git] / libgo / go / syscall / wait.c
1 /* wait.c -- functions for getting wait status values.
2
3    Copyright 2011 The Go Authors. All rights reserved.
4    Use of this source code is governed by a BSD-style
5    license that can be found in the LICENSE file.
6
7    We use C code to extract the wait status so that we can easily be
8    OS-independent.  */
9
10 #include <stdint.h>
11 #include <sys/wait.h>
12
13 #include "runtime.h"
14
15 extern _Bool Exited (uint32_t *w)
16   __asm__ (GOSYM_PREFIX "syscall.Exited.N18_syscall.WaitStatus");
17
18 _Bool
19 Exited (uint32_t *w)
20 {
21   return WIFEXITED (*w) != 0;
22 }
23
24 extern _Bool Signaled (uint32_t *w)
25   __asm__ (GOSYM_PREFIX "syscall.Signaled.N18_syscall.WaitStatus");
26
27 _Bool
28 Signaled (uint32_t *w)
29 {
30   return WIFSIGNALED (*w) != 0;
31 }
32
33 extern _Bool Stopped (uint32_t *w)
34   __asm__ (GOSYM_PREFIX "syscall.Stopped.N18_syscall.WaitStatus");
35
36 _Bool
37 Stopped (uint32_t *w)
38 {
39   return WIFSTOPPED (*w) != 0;
40 }
41
42 extern _Bool Continued (uint32_t *w)
43   __asm__ (GOSYM_PREFIX "syscall.Continued.N18_syscall.WaitStatus");
44
45 _Bool
46 Continued (uint32_t *w)
47 {
48   return WIFCONTINUED (*w) != 0;
49 }
50
51 extern _Bool CoreDump (uint32_t *w)
52   __asm__ (GOSYM_PREFIX "syscall.CoreDump.N18_syscall.WaitStatus");
53
54 _Bool
55 CoreDump (uint32_t *w)
56 {
57   return WCOREDUMP (*w) != 0;
58 }
59
60 extern int ExitStatus (uint32_t *w)
61   __asm__ (GOSYM_PREFIX "syscall.ExitStatus.N18_syscall.WaitStatus");
62
63 int
64 ExitStatus (uint32_t *w)
65 {
66   if (!WIFEXITED (*w))
67     return -1;
68   return WEXITSTATUS (*w);
69 }
70
71 extern int Signal (uint32_t *w)
72   __asm__ (GOSYM_PREFIX "syscall.Signal.N18_syscall.WaitStatus");
73
74 int
75 Signal (uint32_t *w)
76 {
77   if (!WIFSIGNALED (*w))
78     return -1;
79   return WTERMSIG (*w);
80 }
81
82 extern int StopSignal (uint32_t *w)
83   __asm__ (GOSYM_PREFIX "syscall.StopSignal.N18_syscall.WaitStatus");
84
85 int
86 StopSignal (uint32_t *w)
87 {
88   if (!WIFSTOPPED (*w))
89     return -1;
90   return WSTOPSIG (*w);
91 }
92
93 extern int TrapCause (uint32_t *w)
94   __asm__ (GOSYM_PREFIX "syscall.TrapCause.N18_syscall.WaitStatus");
95
96 int
97 TrapCause (uint32_t *w __attribute__ ((unused)))
98 {
99 #ifndef __linux__
100   return -1;
101 #else
102   if (!WIFSTOPPED (*w) || WSTOPSIG (*w) != SIGTRAP)
103     return -1;
104   return *w >> 16;
105 #endif
106 }