[project @ 1999-02-11 14:35:23 by simonm]
authorsimonm <unknown>
Thu, 11 Feb 1999 14:35:26 +0000 (14:35 +0000)
committersimonm <unknown>
Thu, 11 Feb 1999 14:35:26 +0000 (14:35 +0000)
More weak pointer changes.

ghc/lib/exts/Foreign.lhs
ghc/lib/exts/Weak.lhs
ghc/lib/std/PrelGHC.hi-boot
ghc/lib/std/PrelHandle.lhs
ghc/lib/std/PrelWeak.lhs

index cff2424..9297fbc 100644 (file)
@@ -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 ()
index dbbe34a..16f943b 100644 (file)
@@ -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}
index 35bd436..f25fe78 100644 (file)
@@ -291,7 +291,7 @@ __export PrelGHC
   Weakzh
   mkWeakzh
   deRefWeakzh
-  finaliseWeakzh
+  finalizeWeakzh
 
   ForeignObjzh
   makeForeignObjzh
index a11d913..af219aa 100644 (file)
@@ -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)
index 901a385..3b09a39 100644 (file)
@@ -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