#include "posix/Signals.h"
#include "RtsUtils.h"
#include "RtsFlags.h"
+#include "Prelude.h"
+#include "ThrIOManager.h"
#ifdef alpha_HOST_ARCH
# if defined(linux_HOST_OS)
// Here's the pipe into which we will send our signals
static int io_manager_pipe = -1;
+#define IO_MANAGER_WAKEUP 0xff
+#define IO_MANAGER_DIE 0xfe
+
void
setIOManagerPipe (int fd)
{
io_manager_pipe = fd;
}
+#if defined(THREADED_RTS)
+void
+ioManagerWakeup (void)
+{
+ // Wake up the IO Manager thread by sending a byte down its pipe
+ if (io_manager_pipe >= 0) {
+ StgWord8 byte = (StgWord8)IO_MANAGER_WAKEUP;
+ write(io_manager_pipe, &byte, 1);
+ }
+}
+
+void
+ioManagerDie (void)
+{
+ // Ask the IO Manager thread to exit
+ if (io_manager_pipe >= 0) {
+ StgWord8 byte = (StgWord8)IO_MANAGER_DIE;
+ write(io_manager_pipe, &byte, 1);
+ }
+}
+
+void
+ioManagerStart (void)
+{
+ // Make sure the IO manager thread is running
+ Capability *cap;
+ if (io_manager_pipe < 0) {
+ cap = rts_lock();
+ rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);
+ rts_unlock(cap);
+ }
+}
+#endif
+
#if !defined(THREADED_RTS)
#define N_PENDING_HANDLERS 16
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
if (sigaction(SIGINT, &action, &oact) != 0) {
- errorBelch("warning: failed to install SIGINT handler");
+ sysErrorBelch("warning: failed to install SIGINT handler");
}
#if defined(HAVE_SIGINTERRUPT)
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
if (sigaction(SIGCONT, &action, &oact) != 0) {
- errorBelch("warning: failed to install SIGCONT handler");
+ sysErrorBelch("warning: failed to install SIGCONT handler");
}
// install the SIGFPE handler
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
if (sigaction(SIGFPE, &action, &oact) != 0) {
- errorBelch("warning: failed to install SIGFPE handler");
+ sysErrorBelch("warning: failed to install SIGFPE handler");
}
#endif
#endif
}
+void
+freeSignalHandlers(void) {
+ if (signal_handlers != NULL) {
+ stgFree(signal_handlers);
+ }
+}
+
#endif /* RTS_USER_SIGNALS */