diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-10-23 19:04:37 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-10-23 19:04:37 +0000 |
commit | de27caacfb3da386f499e0f1c65a3246675824bc (patch) | |
tree | 664e8146cf480634282350e5f7f68403941ddfea /libgo/go/syscall/wait.c | |
parent | 7b45b87f01235d15b5d9403fa59693a97e49611a (diff) | |
download | gcc-de27caacfb3da386f499e0f1c65a3246675824bc.zip gcc-de27caacfb3da386f499e0f1c65a3246675824bc.tar.gz gcc-de27caacfb3da386f499e0f1c65a3246675824bc.tar.bz2 |
Implement new syscall package.
Calls to library functions now use entersyscall and
exitsyscall as appropriate. This is a first step toward
multiplexing goroutines onto threads.
From-SVN: r180345
Diffstat (limited to 'libgo/go/syscall/wait.c')
-rw-r--r-- | libgo/go/syscall/wait.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/libgo/go/syscall/wait.c b/libgo/go/syscall/wait.c new file mode 100644 index 0000000..cee84c9 --- /dev/null +++ b/libgo/go/syscall/wait.c @@ -0,0 +1,107 @@ +/* wait.c -- functions for getting wait status values. + + Copyright 2011 The Go Authors. All rights reserved. + Use of this source code is governed by a BSD-style + license that can be found in the LICENSE file. + + We use C code to extract the wait status so that we can easily be + OS-independent. */ + +#define _GNU_SOURCE +#define __EXTENSIONS__ + +#include <stdint.h> +#include <sys/wait.h> + +extern _Bool Exited (uint32_t *w) + __asm__ ("libgo_syscall.syscall.Exited.N32_libgo_syscall.syscall.WaitStatus"); + +_Bool +Exited (uint32_t *w) +{ + return WIFEXITED (*w) != 0; +} + +extern _Bool Signaled (uint32_t *w) + __asm__ ("libgo_syscall.syscall.Signaled.N32_libgo_syscall.syscall.WaitStatus"); + +_Bool +Signaled (uint32_t *w) +{ + return WIFSIGNALED (*w) != 0; +} + +extern _Bool Stopped (uint32_t *w) + __asm__ ("libgo_syscall.syscall.Stopped.N32_libgo_syscall.syscall.WaitStatus"); + +_Bool +Stopped (uint32_t *w) +{ + return WIFSTOPPED (*w) != 0; +} + +extern _Bool Continued (uint32_t *w) + __asm__ ("libgo_syscall.syscall.Continued.N32_libgo_syscall.syscall.WaitStatus"); + +_Bool +Continued (uint32_t *w) +{ + return WIFCONTINUED (*w) != 0; +} + +extern _Bool CoreDump (uint32_t *w) + __asm__ ("libgo_syscall.syscall.CoreDump.N32_libgo_syscall.syscall.WaitStatus"); + +_Bool +CoreDump (uint32_t *w) +{ + return WCOREDUMP (*w) != 0; +} + +extern int ExitStatus (uint32_t *w) + __asm__ ("libgo_syscall.syscall.ExitStatus.N32_libgo_syscall.syscall.WaitStatus"); + +int +ExitStatus (uint32_t *w) +{ + if (!WIFEXITED (*w)) + return -1; + return WEXITSTATUS (*w); +} + +extern int Signal (uint32_t *w) + __asm__ ("libgo_syscall.syscall.Signal.N32_libgo_syscall.syscall.WaitStatus"); + +int +Signal (uint32_t *w) +{ + if (!WIFSIGNALED (*w)) + return -1; + return WTERMSIG (*w); +} + +extern int StopSignal (uint32_t *w) + __asm__ ("libgo_syscall.syscall.StopSignal.N32_libgo_syscall.syscall.WaitStatus"); + +int +StopSignal (uint32_t *w) +{ + if (!WIFSTOPPED (*w)) + return -1; + return WSTOPSIG (*w); +} + +extern int TrapCause (uint32_t *w) + __asm__ ("libgo_syscall.syscall.TrapCause.N32_libgo_syscall.syscall.WaitStatus"); + +int +TrapCause (uint32_t *w) +{ +#ifndef __linux__ + return -1; +#else + if (!WIFSTOPPED (*w) || WSTOPSIG (*w) != SIGTRAP) + return -1; + return *w >> 16; +#endif +} |