GHC.Weak says "A weak pointer expresses a relationship between two
objects, the key and the value: if the key is considered to be alive
by the garbage collector, then the value is also alive. A reference
from the value to the key does not keep the key alive."
Am I right to say that if we use the same object for both key and
value, we get the behavior of a traditional weak pointer (where it
doesn't keep the object alive, and becomes null when the object goes)?
I tried to look for use cases where key and value are different, there
are in total only two such cases in GHC's library sources (and a few
others where only the finalizer is of interest):
mkWeakIORef :: IORef a -> IO () -> IO (Weak (IORef a))
mkWeakIORef r@(IORef (STRef r#)) f = IO $ \s ->
case mkWeak# r# r f s of (# s1, w #) -> (# s1, Weak w #)
and
mkWeakThreadId :: ThreadId -> IO (Weak ThreadId)
mkWeakThreadId t@(ThreadId t#) = IO $ \s ->
case mkWeak# t# t (unsafeCoerce# 0#) s of
(# s1, w #) -> (# s1, Weak w #)
In both cases it is trying make a weak reference of an unboxed value
and yet to return its box when de-referencing. I wonder if the same
goal can be achieved by using the following definition:
data Weak v where
Weak :: Weak# w -> (w -> v) -> Weak v
mkWeakIORef :: IORef a -> IO () -> IO (Weak (IORef a))
mkWeakIORef r@(IORef (STRef r#)) f = IO $ \s ->
case mkWeak# r# r# f s of (# s1, w #) -> (# s1, Weak w (IORef . STRef) #)
Apart from some kind mis-matches (no way to annotate v as unlifted
kind), will this definition of mkWeakIORef work the same? If so, It
seems to me that GHC's weak references are no more general than the
traditional definition of weak pointers.
I'm just trying to understand the design rationale behind GHC's weak
references. Any help is greatly appreciated! Thanks!
Regards,
Paul Liu
_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc