[commit: ghc] ghc-8.4: forkProcess: fix task mutex release order (0dc2a35)

git at git.haskell.org git at git.haskell.org
Tue Mar 6 19:02:14 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : ghc-8.4
Link       : http://ghc.haskell.org/trac/ghc/changeset/0dc2a358a954b0b858e91843ade52bb0a28c392d/ghc

>---------------------------------------------------------------

commit 0dc2a358a954b0b858e91843ade52bb0a28c392d
Author: Ömer Sinan Ağacan <omeragacan at gmail.com>
Date:   Fri Mar 2 11:15:03 2018 -0500

    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)


>---------------------------------------------------------------

0dc2a358a954b0b858e91843ade52bb0a28c392d
 rts/Schedule.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/rts/Schedule.c b/rts/Schedule.c
index 8002ac3..828a35f 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



More information about the ghc-commits mailing list