diff options
author | Austin Seipp <austin@well-typed.com> | 2014-11-19 17:27:54 -0600 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2014-11-19 17:28:00 -0600 |
commit | b699fd9abed956af2a785fe653cb9cf8423a8e1c (patch) | |
tree | c13fea2144fb3e2e3ceee39bdaa1bde840939911 | |
parent | c7bc91083b3a76ee8e5652fd60a7d07338601ded (diff) | |
download | haskell-b699fd9abed956af2a785fe653cb9cf8423a8e1c.tar.gz |
Revert "Revert "Revert "rts/base: Fix #9423"" and resolve issue that caused the revert."
This reverts commit 55d2522bd0c48e4c5dac1526cdf53459270baf96.
Signed-off-by: Austin Seipp <austin@well-typed.com>
-rw-r--r-- | includes/rts/IOManager.h | 3 | ||||
-rw-r--r-- | rts/Capability.c | 19 | ||||
-rw-r--r-- | rts/Capability.h | 4 | ||||
-rw-r--r-- | rts/Linker.c | 1 | ||||
-rw-r--r-- | rts/posix/Signals.c | 86 |
5 files changed, 34 insertions, 79 deletions
diff --git a/includes/rts/IOManager.h b/includes/rts/IOManager.h index 7bf2cdf43c..1c331b97af 100644 --- a/includes/rts/IOManager.h +++ b/includes/rts/IOManager.h @@ -26,8 +26,7 @@ void sendIOManagerEvent (HsWord32 event); #else -void setIOManagerControlFd (nat cap_no, int fd); -void setTimerManagerControlFd(int fd); +void setIOManagerControlFd (int fd); void setIOManagerWakeupFd (int fd); #endif diff --git a/rts/Capability.c b/rts/Capability.c index 87c59509cd..16b71b7045 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -27,10 +27,6 @@ #include "STM.h" #include "RtsUtils.h" -#if !defined(mingw32_HOST_OS) -#include "rts/IOManager.h" // for setIOManagerControlFd() -#endif - #include <string.h> // one global capability, this is the Capability for non-threaded @@ -259,9 +255,6 @@ initCapability( Capability *cap, nat i ) cap->spark_stats.converted = 0; cap->spark_stats.gcd = 0; cap->spark_stats.fizzled = 0; -#if !defined(mingw32_HOST_OS) - cap->io_manager_control_wr_fd = -1; -#endif #endif cap->total_allocated = 0; @@ -1080,15 +1073,3 @@ rtsBool checkSparkCountInvariant (void) } #endif - -#if !defined(mingw32_HOST_OS) -void setIOManagerControlFd(nat cap_no USED_IF_THREADS, int fd USED_IF_THREADS) { -#if defined(THREADED_RTS) - if (cap_no < n_capabilities) { - capabilities[cap_no]->io_manager_control_wr_fd = fd; - } else { - errorBelch("warning: setIOManagerControlFd called with illegal capability number."); - } -#endif -} -#endif diff --git a/rts/Capability.h b/rts/Capability.h index fc2bdb0aa6..f342d92244 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -121,10 +121,6 @@ struct Capability_ { // Stats on spark creation/conversion SparkCounters spark_stats; -#if !defined(mingw32_HOST_OS) - // IO manager for this cap - int io_manager_control_wr_fd; -#endif #endif // Total words allocated by this cap since rts start W_ total_allocated; diff --git a/rts/Linker.c b/rts/Linker.c index 124f6cc2b4..ceb6a4f6d8 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -858,7 +858,6 @@ typedef struct _RtsSymbolVal { #if !defined(mingw32_HOST_OS) #define RTS_USER_SIGNALS_SYMBOLS \ SymI_HasProto(setIOManagerControlFd) \ - SymI_HasProto(setTimerManagerControlFd) \ SymI_HasProto(setIOManagerWakeupFd) \ SymI_HasProto(ioManagerWakeup) \ SymI_HasProto(blockUserSignals) \ diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c index a6978e680b..f4a8341c6a 100644 --- a/rts/posix/Signals.c +++ b/rts/posix/Signals.c @@ -124,16 +124,12 @@ more_handlers(int sig) // Here's the pipe into which we will send our signals static int io_manager_wakeup_fd = -1; -static int timer_manager_control_wr_fd = -1; +static int io_manager_control_fd = -1; #define IO_MANAGER_WAKEUP 0xff #define IO_MANAGER_DIE 0xfe #define IO_MANAGER_SYNC 0xfd -void setTimerManagerControlFd(int fd) { - timer_manager_control_wr_fd = fd; -} - void setIOManagerWakeupFd (int fd) { @@ -142,9 +138,14 @@ setIOManagerWakeupFd (int fd) io_manager_wakeup_fd = fd; } -/* ----------------------------------------------------------------------------- - * Wake up at least one IO or timer manager HS thread. - * -------------------------------------------------------------------------- */ +void +setIOManagerControlFd (int fd) +{ + // only called when THREADED_RTS, but unconditionally + // compiled here because GHC.Event.Control depends on it. + io_manager_control_fd = fd; +} + void ioManagerWakeup (void) { @@ -166,24 +167,14 @@ ioManagerWakeup (void) void ioManagerDie (void) { - StgWord8 byte = (StgWord8)IO_MANAGER_DIE; - nat i; - int fd; int r; - - if (0 <= timer_manager_control_wr_fd) { - r = write(timer_manager_control_wr_fd, &byte, 1); + // Ask the IO Manager thread to exit + if (io_manager_control_fd >= 0) { + StgWord8 byte = (StgWord8)IO_MANAGER_DIE; + r = write(io_manager_control_fd, &byte, 1); if (r == -1) { sysErrorBelch("ioManagerDie: write"); } - timer_manager_control_wr_fd = -1; - } - - for (i=0; i < n_capabilities; i++) { - fd = capabilities[i]->io_manager_control_wr_fd; - if (0 <= fd) { - r = write(fd, &byte, 1); - if (r == -1) { sysErrorBelch("ioManagerDie: write"); } - capabilities[i]->io_manager_control_wr_fd = -1; - } + io_manager_control_fd = -1; + io_manager_wakeup_fd = -1; } } @@ -198,10 +189,10 @@ ioManagerStart (void) { // Make sure the IO manager thread is running Capability *cap; - if (timer_manager_control_wr_fd < 0 || io_manager_wakeup_fd < 0) { - cap = rts_lock(); + if (io_manager_control_fd < 0 || io_manager_wakeup_fd < 0) { + cap = rts_lock(); ioManagerStartCap(&cap); - rts_unlock(cap); + rts_unlock(cap); } } #endif @@ -229,37 +220,26 @@ generic_handler(int sig USED_IF_THREADS, { #if defined(THREADED_RTS) - StgWord8 buf[sizeof(siginfo_t) + 1]; - int r; + if (io_manager_control_fd != -1) + { + StgWord8 buf[sizeof(siginfo_t) + 1]; + int r; - buf[0] = sig; - 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)); - } + buf[0] = sig; - if (0 <= timer_manager_control_wr_fd) - { - r = write(timer_manager_control_wr_fd, buf, sizeof(siginfo_t)+1); - if (r == -1 && errno == EAGAIN) { - errorBelch("lost signal due to full pipe: %d\n", sig); - } - } + 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)); + } - nat i; - int fd; - for (i=0; i < n_capabilities; i++) { - fd = capabilities[i]->io_manager_control_wr_fd; - if (0 <= fd) { - r = write(fd, buf, sizeof(siginfo_t)+1); - if (r == -1 && errno == EAGAIN) { - errorBelch("lost signal due to full pipe: %d\n", sig); - } + r = write(io_manager_control_fd, buf, sizeof(siginfo_t)+1); + if (r == -1 && errno == EAGAIN) + { + errorBelch("lost signal due to full pipe: %d\n", sig); } } - // If the IO manager hasn't told us what the FD of the write end // of its pipe is, there's not much we can do here, so just ignore // the signal.. |