Revert "Revert "Revert "rts/base: Fix #9423"" and resolve issue that caused the revert."
authorAustin Seipp <austin@well-typed.com>
Wed, 19 Nov 2014 23:27:54 +0000 (17:27 -0600)
committerAustin Seipp <austin@well-typed.com>
Wed, 19 Nov 2014 23:28:00 +0000 (17:28 -0600)
This reverts commit 55d2522bd0c48e4c5dac1526cdf53459270baf96.

Signed-off-by: Austin Seipp <austin@well-typed.com>
includes/rts/IOManager.h
rts/Capability.c
rts/Capability.h
rts/Linker.c
rts/posix/Signals.c

index 7bf2cdf..1c331b9 100644 (file)
@@ -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
index 87c5950..16b71b7 100644 (file)
 #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
index fc2bdb0..f342d92 100644 (file)
@@ -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;
index 124f6cc..ceb6a4f 100644 (file)
@@ -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)      \
index a6978e6..f4a8341 100644 (file)
@@ -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..