summaryrefslogtreecommitdiff
path: root/libraries/base/GHC/ForeignPtr.hs
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2015-09-18 17:54:22 +0200
committerBen Gamari <ben@smart-cactus.org>2015-09-23 11:56:17 +0200
commitc6bdf4fb0b06ac55a7bb200f0ef31ea9a7a830ec (patch)
tree7077de0aa1bf4769d878c9fc26331a59b62cd706 /libraries/base/GHC/ForeignPtr.hs
parent79f57325dca4d1ce4601d01c4fab50f7bcfc9b9b (diff)
downloadhaskell-c6bdf4fb0b06ac55a7bb200f0ef31ea9a7a830ec.tar.gz
Remove references to () from types of mkWeak# and friends
Previously the types needlessly used (), which is defined ghc-prim, leading to unfortunate import cycles. See #10867 for details. Updates stm submodule.
Diffstat (limited to 'libraries/base/GHC/ForeignPtr.hs')
-rw-r--r--libraries/base/GHC/ForeignPtr.hs16
1 files changed, 13 insertions, 3 deletions
diff --git a/libraries/base/GHC/ForeignPtr.hs b/libraries/base/GHC/ForeignPtr.hs
index 6e288483ea..0b9118ea07 100644
--- a/libraries/base/GHC/ForeignPtr.hs
+++ b/libraries/base/GHC/ForeignPtr.hs
@@ -291,16 +291,26 @@ addForeignPtrConcFinalizer_ (PlainForeignPtr r) finalizer = do
if noFinalizers
then IO $ \s ->
case r of { IORef (STRef r#) ->
- case mkWeak# r# () (foreignPtrFinalizer r) s of { (# s1, _ #) ->
+ case mkWeak# r# () finalizer' s of { (# s1, _ #) ->
(# s1, () #) }}
else return ()
+ where
+ finalizer' :: State# RealWorld -> State# RealWorld
+ finalizer' s =
+ case unIO (foreignPtrFinalizer r) s of
+ (# s', () #) -> s'
addForeignPtrConcFinalizer_ f@(MallocPtr fo r) finalizer = do
noFinalizers <- insertHaskellFinalizer r finalizer
if noFinalizers
then IO $ \s ->
- case mkWeak# fo () (do foreignPtrFinalizer r; touch f) s of
+ case mkWeak# fo () finalizer' s of
(# s1, _ #) -> (# s1, () #)
else return ()
+ where
+ finalizer' :: State# RealWorld -> State# RealWorld
+ finalizer' s =
+ case unIO (foreignPtrFinalizer r >> touch f) s of
+ (# s', () #) -> s'
addForeignPtrConcFinalizer_ _ _ =
error "GHC.ForeignPtr: attempt to add a finalizer to plain pointer"
@@ -359,7 +369,7 @@ foreignPtrFinalizer r = do
case fs of
NoFinalizers -> return ()
CFinalizers w -> IO $ \s -> case finalizeWeak# w s of
- (# s1, 1#, f #) -> f s1
+ (# s1, 1#, f #) -> case f s1 of s2 -> (# s2, () #)
(# s1, _, _ #) -> (# s1, () #)
HaskellFinalizers actions -> sequence_ actions