[commit: base] ghc-7.6: Remove finalizers from a ForeignPtr atomically (#7170) (7a6acb1)
Paolo Capriotti
p.capriotti at gmail.com
Sat Sep 1 17:46:24 CEST 2012
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 <marlowsd at gmail.com>
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
More information about the Cvs-libraries
mailing list