From 0dc2a358a954b0b858e91843ade52bb0a28c392d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= <omeragacan@gmail.com> Date: Fri, 2 Mar 2018 11:15:03 -0500 Subject: [PATCH] forkProcess: fix task mutex release order `all_tasks_mutex` should be released before calling `releaseCapability_` in the parent process as `releaseCapability_` spawns worker tasks in some cases. Reviewers: bgamari, erikd, simonmar Subscribers: rwbarton, thomie, carter GHC Trac Issues: #14538 Differential Revision: https://phabricator.haskell.org/D4460 (cherry picked from commit e261b8523eb547b93b8b9e194bc2566350e7cc60) --- rts/Schedule.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rts/Schedule.c b/rts/Schedule.c index 8002ac37dce2..828a35f4adf9 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -2004,15 +2004,15 @@ forkProcess(HsStablePtr *entry RELEASE_LOCK(&stable_mutex); RELEASE_LOCK(&task->lock); +#if defined(THREADED_RTS) + RELEASE_LOCK(&all_tasks_mutex); +#endif + for (i=0; i < n_capabilities; i++) { releaseCapability_(capabilities[i],false); RELEASE_LOCK(&capabilities[i]->lock); } -#if defined(THREADED_RTS) - RELEASE_LOCK(&all_tasks_mutex); -#endif - boundTaskExiting(task); // just return the pid -- GitLab