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
