[commit: ghc] master: Make finalizers more reliable. (01bb17f)

git at git.haskell.org git at git.haskell.org
Wed May 16 12:42:02 UTC 2018


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

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/01bb17fd4dc6d92cf08632bbb62656428db6e7fa/ghc

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

commit 01bb17fd4dc6d92cf08632bbb62656428db6e7fa
Author: Tamar Christina <tamar at zhox.com>
Date:   Tue May 15 21:20:45 2018 -0400

    Make finalizers more reliable.
    
    Ignore any errors thrown by finalizers when running them.
    
    This prevents a faulty finalizer from stopping the rest being called.
    
    Test Plan: ./validate, new test T13167
    
    Reviewers: hvr, bgamari, simonmar
    
    Reviewed By: bgamari, simonmar
    
    Subscribers: rwbarton, thomie, carter
    
    GHC Trac Issues: #13167
    
    Differential Revision: https://phabricator.haskell.org/D4693


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

01bb17fd4dc6d92cf08632bbb62656428db6e7fa
 libraries/base/GHC/Weak.hs         |  5 +++--
 libraries/base/tests/T13167.hs     | 29 +++++++++++++++++++++++++++++
 libraries/base/tests/T13167.stdout |  1 +
 libraries/base/tests/all.T         |  1 +
 4 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/libraries/base/GHC/Weak.hs b/libraries/base/GHC/Weak.hs
index 8f886a6..6a53096 100644
--- a/libraries/base/GHC/Weak.hs
+++ b/libraries/base/GHC/Weak.hs
@@ -149,8 +149,9 @@ runFinalizerBatch (I# n) arr =
                   0# -> (# s, () #)
                   _  -> let !m' = m -# 1# in
                         case indexArray# arr m' of { (# io #) ->
-                        case io s of          { s' ->
-                        unIO (go m') s'
+                        case catch# (\p -> (# io p, () #))
+                                    (\_ s'' -> (# s'', () #)) s of          {
+                         (# s', _ #) -> unIO (go m') s'
                         }}
    in
         go n
diff --git a/libraries/base/tests/T13167.hs b/libraries/base/tests/T13167.hs
new file mode 100644
index 0000000..e41104c
--- /dev/null
+++ b/libraries/base/tests/T13167.hs
@@ -0,0 +1,29 @@
+import Data.IORef
+import Control.Monad
+import Control.Exception
+import Control.Concurrent.MVar
+import System.Mem
+
+main :: IO ()
+main = do
+  run
+  run
+  run
+  run
+  m <- newEmptyMVar
+  quit m
+  performMajorGC
+  takeMVar m
+
+run :: IO ()
+run = do
+  ref <- newIORef ()
+  void $ mkWeakIORef ref $ do
+    putStr "."
+    throwIO $ ErrorCall "failed"
+
+quit :: MVar () -> IO ()
+quit m = do
+  ref <- newIORef ()
+  void $ mkWeakIORef ref $ do
+    putMVar m ()
diff --git a/libraries/base/tests/T13167.stdout b/libraries/base/tests/T13167.stdout
new file mode 100644
index 0000000..4918d25
--- /dev/null
+++ b/libraries/base/tests/T13167.stdout
@@ -0,0 +1 @@
+....
diff --git a/libraries/base/tests/all.T b/libraries/base/tests/all.T
index 491df2f..d530e10 100644
--- a/libraries/base/tests/all.T
+++ b/libraries/base/tests/all.T
@@ -224,3 +224,4 @@ test('T3474',
 test('T14425', normal, compile_and_run, [''])
 test('T10412', normal, compile_and_run, [''])
 test('T13896', normal, compile_and_run, [''])
+test('T13167', normal, compile_and_run, [''])



More information about the ghc-commits mailing list