8a9f2a6bbd
Compiling with LTO revealed a number of cases in the runtime and standard library where C and Go disagreed about the type of an object or function (or where Go and code generated by the compiler disagreed). In all cases the underlying representation was the same (e.g., uintptr vs. void*), so this wasn't causing actual problems, but it did result in a number of annoying warnings when compiling with LTO. Reviewed-on: https://go-review.googlesource.com/c/160700 From-SVN: r268923
115 lines
2.1 KiB
C
115 lines
2.1 KiB
C
/* 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. */
|
|
|
|
#include <stdint.h>
|
|
#include <sys/wait.h>
|
|
|
|
#include "runtime.h"
|
|
|
|
#ifndef WCOREDUMP
|
|
#define WCOREDUMP(status) (((status) & 0200) != 0)
|
|
#endif
|
|
|
|
#ifndef WIFCONTINUED
|
|
#define WIFCONTINUED(x) 0
|
|
#endif
|
|
|
|
extern _Bool Exited (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Exited");
|
|
|
|
_Bool
|
|
Exited (uint32_t *w)
|
|
{
|
|
return WIFEXITED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool Signaled (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signaled");
|
|
|
|
_Bool
|
|
Signaled (uint32_t *w)
|
|
{
|
|
return WIFSIGNALED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool Stopped (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Stopped");
|
|
|
|
_Bool
|
|
Stopped (uint32_t *w)
|
|
{
|
|
return WIFSTOPPED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool Continued (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Continued");
|
|
|
|
_Bool
|
|
Continued (uint32_t *w)
|
|
{
|
|
return WIFCONTINUED (*w) != 0;
|
|
}
|
|
|
|
extern _Bool CoreDump (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.CoreDump");
|
|
|
|
_Bool
|
|
CoreDump (uint32_t *w)
|
|
{
|
|
return WCOREDUMP (*w) != 0;
|
|
}
|
|
|
|
extern intgo ExitStatus (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.ExitStatus");
|
|
|
|
intgo
|
|
ExitStatus (uint32_t *w)
|
|
{
|
|
if (!WIFEXITED (*w))
|
|
return -1;
|
|
return WEXITSTATUS (*w);
|
|
}
|
|
|
|
extern intgo Signal (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.Signal");
|
|
|
|
intgo
|
|
Signal (uint32_t *w)
|
|
{
|
|
if (!WIFSIGNALED (*w))
|
|
return -1;
|
|
return WTERMSIG (*w);
|
|
}
|
|
|
|
extern intgo StopSignal (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.StopSignal");
|
|
|
|
intgo
|
|
StopSignal (uint32_t *w)
|
|
{
|
|
if (!WIFSTOPPED (*w))
|
|
return -1;
|
|
return WSTOPSIG (*w);
|
|
}
|
|
|
|
extern intgo TrapCause (uint32_t *w)
|
|
__asm__ (GOSYM_PREFIX "syscall.WaitStatus.TrapCause");
|
|
|
|
intgo
|
|
TrapCause (uint32_t *w __attribute__ ((unused)))
|
|
{
|
|
#ifndef __linux__
|
|
return -1;
|
|
#else
|
|
if (!WIFSTOPPED (*w) || WSTOPSIG (*w) != SIGTRAP)
|
|
return -1;
|
|
return *w >> 16;
|
|
#endif
|
|
}
|