More weak pointer changes.
ForeignObj -- abstract, instance of: Eq
, makeForeignObj -- :: Addr{-obj-} -> IO ForeignObj
, writeForeignObj -- :: ForeignObj -> Addr{-new obj-} -> IO ()
- , addForeignFinaliser -- :: ForeignObj -> IO () -> IO ()
+ , addForeignFinalizer -- :: ForeignObj -> IO () -> IO ()
, foreignObjToAddr -- :: ForeignObj -> IO Addr
-- the coercion from a foreign obj. to an addr. is unsafe,
-- and should not be used unless absolutely necessary.
indexDoubleOffForeignObj#
)
import PrelAddr ( Addr(..), Word(..) )
-import PrelWeak ( addForeignFinaliser )
+import PrelWeak ( addForeignFinalizer )
import Word
(
indexWord8OffForeignObj
begin{code}
makeForeignObj :: Addr -> Addr -> IO ForeignObj
-makeForeignObj obj finaliser = do
+makeForeignObj obj finalizer = do
fobj <- PF.makeForeignObj obj
- addForeignFinaliser fobj (app0 finaliser)
+ addForeignFinalizer fobj (app0 finalizer)
return fobj
foreign import dynamic unsafe app0 :: Addr -> IO ()
Weak, -- abstract
-- instance Eq (Weak v)
- mkWeak, -- :: k -> v -> IO () -> IO (Weak v)
+ mkWeak, -- :: k -> v -> Maybe (IO ()) -> IO (Weak v)
deRefWeak, -- :: Weak v -> IO (Maybe v)
- finalise, -- :: Weak v -> IO ()
+ finalize, -- :: Weak v -> IO ()
-- replaceFinaliser -- :: Weak v -> IO () -> IO ()
- mkWeakNoFinaliser, -- :: k -> v -> IO (Weak v)
- mkWeakPtr, -- :: k -> IO () -> IO (Weak k)
- mkWeakPair, -- :: k -> v -> IO () -> IO (Weak (k,v))
- addFinaliser, -- :: key -> IO () -> IO ()
- addForeignFinaliser -- :: ForeignObj -> IO () -> IO ()
+ mkWeakPtr, -- :: k -> Maybe (IO ()) -> IO (Weak k)
+ mkWeakPair, -- :: k -> v -> Maybe (IO ()) -> IO (Weak (k,v))
+ addFinalizer, -- :: key -> IO () -> IO ()
+ addForeignFinalizer -- :: ForeignObj -> IO () -> IO ()
) where
import PrelBase
0# -> (# s1, Nothing #)
_ -> (# s1, Just p #)
-mkWeakNoFinaliser key val = IO $ \s ->
- -- zero is a valid finaliser argument to mkWeak#, and means "no finaliser"
- case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) ->
- (# s1, Weak w #) }
-
-mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
-mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
-
-finalise :: Weak v -> IO ()
-finalise (Weak w) = IO $ \s ->
- case finaliseWeak# w s of s1 -> (# s1, () #)
+mkWeakPair :: k -> v -> Maybe (IO ()) -> IO (Weak (k,v))
+mkWeakPair key val finalizer = mkWeak key (key,val) finalizer
+finalize :: Weak v -> IO ()
+finalize (Weak w) = IO $ \s ->
+ case finalizeWeak# w s of
+ (# s1, 0#, _ #) -> (# s1, () #) -- already dead, or no finaliser
+ (# s1, _, f #) -> f s1
\end{code}
Weakzh
mkWeakzh
deRefWeakzh
- finaliseWeakzh
+ finalizeWeakzh
ForeignObjzh
makeForeignObjzh
import PrelAddr ( Addr, nullAddr )
import PrelBounded () -- get at Bounded Int instance.
import PrelNum ( toInteger )
-import PrelWeak ( addForeignFinaliser )
+import PrelWeak ( addForeignFinalizer )
#if __CONCURRENT_HASKELL__
import PrelConc
#endif
%*********************************************************
%* *
-\subsection{Handle Finalisers}
+\subsection{Handle Finalizers}
%* *
%*********************************************************
#ifndef __PARALLEL_HASKELL__
fo <- makeForeignObj fo
- addForeignFinaliser fo (freeStdFileObject fo)
+ addForeignFinalizer fo (freeStdFileObject fo)
#endif
#ifdef __HUGS__
#ifndef __PARALLEL_HASKELL__
fo <- makeForeignObj fo
- addForeignFinaliser fo (freeStdFileObject fo)
+ addForeignFinalizer fo (freeStdFileObject fo)
#endif
(bm, bf_size) <- getBMode__ fo
mkBuffer__ fo bf_size
#ifndef __PARALLEL_HASKELL__
fo <- makeForeignObj fo
- addForeignFinaliser fo (freeStdFileObject fo)
+ addForeignFinalizer fo (freeStdFileObject fo)
#endif
hdl <- newHandle (Handle__ fo WriteHandle NoBuffering "stderr")
-- when stderr and stdout are both connected to a terminal, ensure
if fo /= nullAddr then do
#ifndef __PARALLEL_HASKELL__
fo <- makeForeignObj fo
- addForeignFinaliser fo (freeFileObject fo)
+ addForeignFinalizer fo (freeFileObject fo)
#endif
(bm, bf_size) <- getBMode__ fo
mkBuffer__ fo bf_size
has been performed, the ForeignObj embedded in the Handle
is still lying around in the heap, so care is taken
to avoid closing the file object when the ForeignObj
- is finalised. (we overwrite the file ptr in the underlying
+ is finalized. (we overwrite the file ptr in the underlying
FileObject with a NULL as part of closeFile())
-}
if rc == (0::Int)
import PrelGHC
import PrelBase
+import PrelMaybe
import PrelIOBase
import PrelForeign
mkWeak :: k -- key
-> v -- value
- -> IO () -- finaliser
+ -> Maybe (IO ()) -- finalizer
-> IO (Weak v) -- weak pointer
-mkWeak key val finaliser = IO $ \s ->
- case mkWeak# key val finaliser s of { (# s1, w #) ->
- (# s1, Weak w #) }
+mkWeak key val (Just finalizer) = IO $ \s ->
+ case mkWeak# key val finalizer s of { (# s1, w #) -> (# s1, Weak w #) }
+mkWeak key val Nothing = IO $ \s ->
+ case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) -> (# s1, Weak w #) }
-mkWeakPtr :: k -> IO () -> IO (Weak k)
-mkWeakPtr key finaliser = mkWeak key key finaliser
+mkWeakPtr :: k -> Maybe (IO ()) -> IO (Weak k)
+mkWeakPtr key finalizer = mkWeak key key finalizer
-addFinaliser :: key -> IO () -> IO ()
-addFinaliser key finaliser = do
- mkWeakPtr key finaliser -- throw it away
+addFinalizer :: key -> IO () -> IO ()
+addFinalizer key finalizer = do
+ mkWeakPtr key (Just finalizer) -- throw it away
return ()
-addForeignFinaliser :: ForeignObj -> IO () -> IO ()
-addForeignFinaliser (ForeignObj fo) finaliser = addFinaliser fo finaliser
+addForeignFinalizer :: ForeignObj -> IO () -> IO ()
+addForeignFinalizer (ForeignObj fo) finalizer = addFinalizer fo finalizer
{-
instance Eq (Weak v) where