X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSignals.c;h=3b93fccbb70f13512b133d6d9d47dcbcdc139fc2;hb=2d5e052d795c99c17b1ca6fa1ca8be7d082be09c;hp=aa7877452ba0d18df665453b03e04593431c21dc;hpb=3501ac6af749ada0afcaf84f112ab2e4bf9120b9;p=ghc-hetmet.git diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c index aa78774..3b93fcc 100644 --- a/rts/posix/Signals.c +++ b/rts/posix/Signals.c @@ -86,18 +86,16 @@ 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) { // only called when THREADED_RTS, but unconditionally // compiled here because GHC.Conc depends on it. - if (io_manager_pipe < 0) { - io_manager_pipe = fd; - } + io_manager_pipe = fd; } -#if defined(THREADED_RTS) void ioManagerWakeup (void) { @@ -111,6 +109,19 @@ ioManagerWakeup (void) } 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; @@ -124,12 +135,6 @@ ioManagerDie (void) } } -Capability * -ioManagerStartCap (Capability *cap) -{ - return rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL); -} - void ioManagerStart (void) { @@ -137,7 +142,7 @@ ioManagerStart (void) Capability *cap; if (io_manager_pipe < 0) { cap = rts_lock(); - cap = ioManagerStartCap(cap); + cap = rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL); rts_unlock(cap); } }