X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSignals.c;h=a5044cd6de08c34af2d904128e91b65a5e983d4f;hb=fe07f054d7ae5e10b14d5fed730fe4424dabd587;hp=5f5f77fd39fd6d40b1b7b5894ab7e7c0026a32c6;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c index 5f5f77f..a5044cd 100644 --- a/rts/posix/Signals.c +++ b/rts/posix/Signals.c @@ -16,6 +16,7 @@ #include "posix/Signals.h" #include "RtsUtils.h" #include "RtsFlags.h" +#include "Prelude.h" #ifdef alpha_HOST_ARCH # if defined(linux_HOST_OS) @@ -107,6 +108,9 @@ more_handlers(I_ sig) // Here's the pipe into which we will send our signals static int io_manager_pipe = -1; +#define IO_MANAGER_WAKEUP 0xff +#define IO_MANAGER_DIE 0xfe + void setIOManagerPipe (int fd) { @@ -115,6 +119,40 @@ setIOManagerPipe (int fd) io_manager_pipe = fd; } +#if defined(THREADED_RTS) +void +ioManagerWakeup (void) +{ + // 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); + } +} + +void +ioManagerDie (void) +{ + // Ask the IO Manager thread to exit + if (io_manager_pipe >= 0) { + StgWord8 byte = (StgWord8)IO_MANAGER_DIE; + write(io_manager_pipe, &byte, 1); + } +} + +void +ioManagerStart (void) +{ + // Make sure the IO manager thread is running + Capability *cap; + if (io_manager_pipe < 0) { + cap = rts_lock(); + rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL); + rts_unlock(cap); + } +} +#endif + #if !defined(THREADED_RTS) #define N_PENDING_HANDLERS 16 @@ -468,7 +506,7 @@ initDefaultHandlers() sigemptyset(&action.sa_mask); action.sa_flags = 0; if (sigaction(SIGINT, &action, &oact) != 0) { - errorBelch("warning: failed to install SIGINT handler"); + sysErrorBelch("warning: failed to install SIGINT handler"); } #if defined(HAVE_SIGINTERRUPT) @@ -480,7 +518,7 @@ initDefaultHandlers() sigemptyset(&action.sa_mask); action.sa_flags = 0; if (sigaction(SIGCONT, &action, &oact) != 0) { - errorBelch("warning: failed to install SIGCONT handler"); + sysErrorBelch("warning: failed to install SIGCONT handler"); } // install the SIGFPE handler @@ -498,7 +536,7 @@ initDefaultHandlers() sigemptyset(&action.sa_mask); action.sa_flags = 0; if (sigaction(SIGFPE, &action, &oact) != 0) { - errorBelch("warning: failed to install SIGFPE handler"); + sysErrorBelch("warning: failed to install SIGFPE handler"); } #endif