summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Henry <sylvain@haskus.fr>2021-07-21 11:18:14 +0200
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-07-26 04:55:03 -0400
commit5f3991c7cab8ccc9ab8daeebbfce57afbd9acc33 (patch)
tree72e2bbaa8270290a8464c557c863cf0551f9abfa
parent5b39a10781da9d428bf98d934d0f82eb55054183 (diff)
downloadhaskell-5f3991c7cab8ccc9ab8daeebbfce57afbd9acc33.tar.gz
RTS: try to fix timer races
* Pthread based timer was initialized started while some other parts of the RTS assume it is initialized stopped, e.g. in hs_init_ghc: /* Start the "ticker" and profiling timer but don't start until the * scheduler is up. However, the ticker itself needs to be initialized * before the scheduler to ensure that the ticker mutex is initialized as * moreCapabilities will attempt to acquire it. */ * after a fork, don't start the timer before the IOManager is initialized: the timer handler (handle_tick) might call wakeUpRts to perform an idle GC, which calls wakeupIOManager/ioManagerWakeup Found while debugging #18033/#20132 but I couldn't confirm if it fixes them.
-rw-r--r--rts/Schedule.c5
-rw-r--r--rts/posix/itimer/Pthread.c2
2 files changed, 5 insertions, 2 deletions
diff --git a/rts/Schedule.c b/rts/Schedule.c
index e0631482c9..c5a5041587 100644
--- a/rts/Schedule.c
+++ b/rts/Schedule.c
@@ -2194,7 +2194,6 @@ forkProcess(HsStablePtr *entry
// On Unix, all timers are reset in the child, so we need to start
// the timer again.
initTimer();
- startTimer();
// TODO: need to trace various other things in the child
// like startup event, capabilities, process info etc
@@ -2202,6 +2201,10 @@ forkProcess(HsStablePtr *entry
initIOManagerAfterFork(&cap);
+ // start timer after the IOManager is initialized
+ // (the idle GC may wake up the IOManager)
+ startTimer();
+
// Install toplevel exception handlers, so interruption
// signal will be sent to the main thread.
// See #12903
diff --git a/rts/posix/itimer/Pthread.c b/rts/posix/itimer/Pthread.c
index 5098d4f117..84501acb6f 100644
--- a/rts/posix/itimer/Pthread.c
+++ b/rts/posix/itimer/Pthread.c
@@ -169,7 +169,7 @@ void
initTicker (Time interval, TickProc handle_tick)
{
itimer_interval = interval;
- stopped = false;
+ stopped = true;
exited = false;
#if defined(HAVE_SIGNAL_H)
sigset_t mask, omask;