X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSchedule.c;h=3d87003756ff7f72fbb9f0ba696e627f2ab9bbd7;hb=85174045bbcc05adb28447d423794d1f087da59e;hp=a7a0f33872ff1048c68a1673e07fff7a3d351f85;hpb=911b42b27ad5f039465d14052460e2d9dde053ab;p=ghc-hetmet.git diff --git a/rts/Schedule.c b/rts/Schedule.c index a7a0f33..3d87003 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -643,7 +643,7 @@ run_thread: t->saved_errno = errno; #if mingw32_HOST_OS // Similarly for Windows error code - SetLastError(t->saved_winerror); + t->saved_winerror = GetLastError(); #endif #if defined(THREADED_RTS) @@ -862,7 +862,8 @@ schedulePushWork(Capability *cap USED_IF_THREADS, static void scheduleStartSignalHandlers(Capability *cap) { - if (signals_pending()) { // safe outside the lock + if (RtsFlags.MiscFlags.install_signal_handlers && signals_pending()) { + // safe outside the lock startSignalHandlers(cap); } } @@ -985,7 +986,7 @@ scheduleDetectDeadlock (Capability *cap, Task *task) * for signals to arrive rather then bombing out with a * deadlock. */ - if ( anyUserHandlers() ) { + if ( RtsFlags.MiscFlags.install_signal_handlers && anyUserHandlers() ) { debugTrace(DEBUG_sched, "still deadlocked, waiting for signals..."); @@ -2110,7 +2111,7 @@ scheduleDoGC (Capability *cap, Task *task USED_IF_THREADS, rtsBool force_major) * Singleton fork(). Do not copy any running threads. * ------------------------------------------------------------------------- */ -StgInt +pid_t forkProcess(HsStablePtr *entry #ifndef FORKPROCESS_PRIMOP_SUPPORTED STG_UNUSED @@ -2195,6 +2196,10 @@ forkProcess(HsStablePtr *entry cap->returning_tasks_tl = NULL; #endif + // On Unix, all timers are reset in the child, so we need to start + // the timer again. + startTimer(); + cap = rts_evalStableIO(cap, entry, NULL); // run the action rts_checkSchedStatus("forkProcess",cap); @@ -2704,7 +2709,9 @@ GetRoots( evac_fn evac ) #if defined(RTS_USER_SIGNALS) // mark the signal handlers (signals should be already blocked) - markSignalHandlers(evac); + if (RtsFlags.MiscFlags.install_signal_handlers) { + markSignalHandlers(evac); + } #endif }