summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Seipp <austin@well-typed.com>2014-11-19 17:27:54 -0600
committerAustin Seipp <austin@well-typed.com>2014-11-19 17:28:00 -0600
commitb699fd9abed956af2a785fe653cb9cf8423a8e1c (patch)
treec13fea2144fb3e2e3ceee39bdaa1bde840939911
parentc7bc91083b3a76ee8e5652fd60a7d07338601ded (diff)
downloadhaskell-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.h3
-rw-r--r--rts/Capability.c19
-rw-r--r--rts/Capability.h4
-rw-r--r--rts/Linker.c1
-rw-r--r--rts/posix/Signals.c86
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..