Repository : ssh://darcs.haskell.org//srv/darcs/packages/base On branch : ghc-7.6
http://hackage.haskell.org/trac/ghc/changeset/7a6acb111f6013edafcd8761d496fa06c64d7b75 >--------------------------------------------------------------- commit 7a6acb111f6013edafcd8761d496fa06c64d7b75 Author: Simon Marlow <[email protected]> Date: Tue Aug 21 15:42:50 2012 +0100 Remove finalizers from a ForeignPtr atomically (#7170) MERGED from commit 895dd47937c6c9340bf4f289f9f43d5f9be9ffcc >--------------------------------------------------------------- GHC/ForeignPtr.hs | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/GHC/ForeignPtr.hs b/GHC/ForeignPtr.hs index 244e0fd..2fbdeac 100644 --- a/GHC/ForeignPtr.hs +++ b/GHC/ForeignPtr.hs @@ -342,7 +342,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 @@ -407,10 +409,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
