X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSignals.c;h=4bb1255dac8d9d8d2e3bf3461e7c7a0b84c99d05;hb=eb39f720c731b10b340ebadc809d91f9683ea157;hp=3b93fccbb70f13512b133d6d9d47dcbcdc139fc2;hpb=2d5e052d795c99c17b1ca6fa1ca8be7d082be09c;p=ghc-hetmet.git diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c index 3b93fcc..4bb1255 100644 --- a/rts/posix/Signals.c +++ b/rts/posix/Signals.c @@ -135,6 +135,12 @@ ioManagerDie (void) } } +Capability * +ioManagerStartCap (Capability *cap) +{ + return rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL); +} + void ioManagerStart (void) { @@ -142,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); } } @@ -177,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) {