[commit: base] master: Remove finalizers from a ForeignPtr atomically (#7170) (895dd47)
Simon Marlow
marlowsd at gmail.com
Tue Aug 21 16:54:33 CEST 2012
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 <marlowsd at gmail.com>
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
More information about the Cvs-libraries
mailing list