From: simonm Date: Thu, 11 Feb 1999 14:35:26 +0000 (+0000) Subject: [project @ 1999-02-11 14:35:23 by simonm] X-Git-Tag: Approximately_9120_patches~6566 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=63ac31ced32993cf7b9d2e76c2b3d74020baeb50;p=ghc-hetmet.git [project @ 1999-02-11 14:35:23 by simonm] More weak pointer changes. --- diff --git a/ghc/lib/exts/Foreign.lhs b/ghc/lib/exts/Foreign.lhs index cff2424..9297fbc 100644 --- a/ghc/lib/exts/Foreign.lhs +++ b/ghc/lib/exts/Foreign.lhs @@ -10,7 +10,7 @@ module Foreign 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. @@ -30,7 +30,7 @@ import PrelGHC ( indexCharOffForeignObj#, indexIntOffForeignObj#, indexDoubleOffForeignObj# ) import PrelAddr ( Addr(..), Word(..) ) -import PrelWeak ( addForeignFinaliser ) +import PrelWeak ( addForeignFinalizer ) import Word ( indexWord8OffForeignObj @@ -72,9 +72,9 @@ foreignObjToAddr fo = _casm_ `` %r=(StgAddr)%0; '' fo 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 () diff --git a/ghc/lib/exts/Weak.lhs b/ghc/lib/exts/Weak.lhs index dbbe34a..16f943b 100644 --- a/ghc/lib/exts/Weak.lhs +++ b/ghc/lib/exts/Weak.lhs @@ -9,16 +9,15 @@ module Weak ( 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 @@ -33,16 +32,12 @@ deRefWeak (Weak w) = IO $ \s -> 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} diff --git a/ghc/lib/std/PrelGHC.hi-boot b/ghc/lib/std/PrelGHC.hi-boot index 35bd436..f25fe78 100644 --- a/ghc/lib/std/PrelGHC.hi-boot +++ b/ghc/lib/std/PrelGHC.hi-boot @@ -291,7 +291,7 @@ __export PrelGHC Weakzh mkWeakzh deRefWeakzh - finaliseWeakzh + finalizeWeakzh ForeignObjzh makeForeignObjzh diff --git a/ghc/lib/std/PrelHandle.lhs b/ghc/lib/std/PrelHandle.lhs index a11d913..af219aa 100644 --- a/ghc/lib/std/PrelHandle.lhs +++ b/ghc/lib/std/PrelHandle.lhs @@ -24,7 +24,7 @@ import PrelMaybe ( Maybe(..) ) 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 @@ -137,7 +137,7 @@ mkErrorHandle__ ioe = %********************************************************* %* * -\subsection{Handle Finalisers} +\subsection{Handle Finalizers} %* * %********************************************************* @@ -188,7 +188,7 @@ stdout = unsafePerformIO (do #ifndef __PARALLEL_HASKELL__ fo <- makeForeignObj fo - addForeignFinaliser fo (freeStdFileObject fo) + addForeignFinalizer fo (freeStdFileObject fo) #endif #ifdef __HUGS__ @@ -222,7 +222,7 @@ stdin = unsafePerformIO (do #ifndef __PARALLEL_HASKELL__ fo <- makeForeignObj fo - addForeignFinaliser fo (freeStdFileObject fo) + addForeignFinalizer fo (freeStdFileObject fo) #endif (bm, bf_size) <- getBMode__ fo mkBuffer__ fo bf_size @@ -254,7 +254,7 @@ stderr = unsafePerformIO (do #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 @@ -295,7 +295,7 @@ openFileEx f m = do 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 @@ -373,7 +373,7 @@ hClose handle = 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) diff --git a/ghc/lib/std/PrelWeak.lhs b/ghc/lib/std/PrelWeak.lhs index 901a385..3b09a39 100644 --- a/ghc/lib/std/PrelWeak.lhs +++ b/ghc/lib/std/PrelWeak.lhs @@ -11,6 +11,7 @@ module PrelWeak where import PrelGHC import PrelBase +import PrelMaybe import PrelIOBase import PrelForeign @@ -18,23 +19,24 @@ data Weak v = Weak (Weak# v) 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