Repository : ssh://darcs.haskell.org//srv/darcs/packages/base

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/895dd47937c6c9340bf4f289f9f43d5f9be9ffcc

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

commit 895dd47937c6c9340bf4f289f9f43d5f9be9ffcc
Author: Simon Marlow <[email protected]>
Date:   Tue Aug 21 15:42:50 2012 +0100

    Remove finalizers from a ForeignPtr atomically (#7170)

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

 GHC/ForeignPtr.hs |    9 ++++-----
 1 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/GHC/ForeignPtr.hs b/GHC/ForeignPtr.hs
index 7e72315..a9c859a 100644
--- a/GHC/ForeignPtr.hs
+++ b/GHC/ForeignPtr.hs
@@ -344,7 +344,9 @@ noMixing ftype0 r mkF = do
        return (null fs)
 
 foreignPtrFinalizer :: IORef (Finalizers, [IO ()]) -> IO ()
-foreignPtrFinalizer r = do (_, fs) <- readIORef r; sequence_ fs
+foreignPtrFinalizer r = do
+  fs <- atomicModifyIORef r $ \(f,fs) -> ((f,[]), fs) -- atomic, see #7170
+  sequence_ fs
 
 newForeignPtr_ :: Ptr a -> IO (ForeignPtr a)
 -- ^Turns a plain memory reference into a foreign pointer that may be
@@ -409,10 +411,7 @@ castForeignPtr f = unsafeCoerce# f
 -- immediately.
 finalizeForeignPtr :: ForeignPtr a -> IO ()
 finalizeForeignPtr (ForeignPtr _ (PlainPtr _)) = return () -- no effect
-finalizeForeignPtr (ForeignPtr _ foreignPtr) = do
-        (ftype, finalizers) <- readIORef refFinalizers
-        sequence_ finalizers
-        writeIORef refFinalizers (ftype, [])
+finalizeForeignPtr (ForeignPtr _ foreignPtr) = foreignPtrFinalizer 
refFinalizers
         where
                 refFinalizers = case foreignPtr of
                         (PlainForeignPtr ref) -> ref



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to