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