X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSignals.c;h=4bb1255dac8d9d8d2e3bf3461e7c7a0b84c99d05;hb=bb7b45dcf16118fb03bf28aea08a168ac6598a33;hp=c016b9bf75136fae28e6047bf05b72554dbf955e;hpb=7ed3f7556f46b957f7efb97ed7ebdc92db2f8ab7;p=ghc-hetmet.git diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c index c016b9b..4bb1255 100644 --- a/rts/posix/Signals.c +++ b/rts/posix/Signals.c @@ -6,18 +6,15 @@ * * ---------------------------------------------------------------------------*/ -/* This is non-Posix-compliant. - #include "PosixSource.h" -*/ +#include "PosixSource.h" #include "Rts.h" -#include "SchedAPI.h" + #include "Schedule.h" #include "RtsSignals.h" -#include "posix/Signals.h" +#include "Signals.h" #include "RtsUtils.h" -#include "RtsFlags.h" #include "Prelude.h" -#include "ThrIOManager.h" +#include "Stable.h" #ifdef alpha_HOST_ARCH # if defined(linux_HOST_OS) @@ -89,6 +86,7 @@ static int io_manager_pipe = -1; #define IO_MANAGER_WAKEUP 0xff #define IO_MANAGER_DIE 0xfe +#define IO_MANAGER_SYNC 0xfd void setIOManagerPipe (int fd) @@ -98,29 +96,51 @@ setIOManagerPipe (int fd) io_manager_pipe = fd; } -#if defined(THREADED_RTS) void ioManagerWakeup (void) { + int r; // Wake up the IO Manager thread by sending a byte down its pipe if (io_manager_pipe >= 0) { StgWord8 byte = (StgWord8)IO_MANAGER_WAKEUP; - write(io_manager_pipe, &byte, 1); + r = write(io_manager_pipe, &byte, 1); + if (r == -1) { sysErrorBelch("ioManagerWakeup: write"); } } } void +ioManagerSync (void) +{ + int r; + // Wake up the IO Manager thread by sending a byte down its pipe + if (io_manager_pipe >= 0) { + StgWord8 byte = (StgWord8)IO_MANAGER_SYNC; + r = write(io_manager_pipe, &byte, 1); + if (r == -1) { sysErrorBelch("ioManagerSync: write"); } + } +} + +#if defined(THREADED_RTS) +void ioManagerDie (void) { + int r; // Ask the IO Manager thread to exit if (io_manager_pipe >= 0) { StgWord8 byte = (StgWord8)IO_MANAGER_DIE; - write(io_manager_pipe, &byte, 1); + r = write(io_manager_pipe, &byte, 1); + if (r == -1) { sysErrorBelch("ioManagerDie: write"); } close(io_manager_pipe); io_manager_pipe = -1; } } +Capability * +ioManagerStartCap (Capability *cap) +{ + return rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL); +} + void ioManagerStart (void) { @@ -128,7 +148,7 @@ ioManagerStart (void) Capability *cap; if (io_manager_pipe < 0) { cap = rts_lock(); - cap = rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL); + cap = ioManagerStartCap(cap); rts_unlock(cap); } } @@ -155,8 +175,6 @@ generic_handler(int sig USED_IF_THREADS, siginfo_t *info, void *p STG_UNUSED) { - sigset_t signals; - #if defined(THREADED_RTS) if (io_manager_pipe != -1) @@ -165,7 +183,14 @@ generic_handler(int sig USED_IF_THREADS, int r; buf[0] = sig; - memcpy(buf+1, info, sizeof(siginfo_t)); + + if (info == NULL) { + // info may be NULL on Solaris (see #3790) + memset(buf+1, 0, sizeof(siginfo_t)); + } else { + memcpy(buf+1, info, sizeof(siginfo_t)); + } + r = write(io_manager_pipe, buf, sizeof(siginfo_t)+1); if (r == -1 && errno == EAGAIN) { @@ -216,14 +241,9 @@ generic_handler(int sig USED_IF_THREADS, stg_exit(EXIT_FAILURE); } - MainCapability.context_switch = 1; + contextSwitchCapability(&MainCapability); #endif /* THREADED_RTS */ - - // re-establish the signal handler, and carry on - sigemptyset(&signals); - sigaddset(&signals, sig); - sigprocmask(SIG_UNBLOCK, &signals, NULL); } /* -----------------------------------------------------------------------------