On 24/05/2014 01:11, Luite Stegeman wrote:

    In particular, the variant of weak reference you suggest is the
    /ephemeron/ semantics in Hayes.  Their reachability rule is:

         The value field of an ephemeron is reachable if both (a) the
         ephemeron (weak pointer object) is reachable, and (b) the key is
         reachable.


Actually it's not the same, since I think the finalizer should still be
run if the weak pointer object is unreachable (and it should run when
the key becomes unreachable).

The implementation would indeed need to keep some reference to the key
and finalizer around after the weak pointer becomes unreachable, perhaps
on some weak pointers list, but the same goes for GHC's semantics. The
only difference is that the value (which might in turn make a whole
bunch of other data reachable) would not have to be retained.

I haven't been able to think of any issues with considering the value
unreachable here, so I'm still puzzled as to why GHC's semantics would
be preferable. It doesn't look like it would complicate implementation
too much either.

So the semantics is currently:

  w <- mkWeak k v f

 1. v is reachable if k is reachable
 2. f is reachable if k is reachable
 3. when k is unreachable, the finalizer f is run
 4. deRefWeak w returns
    - Nothing, if k is not reachable
    - Just v, otherwise

In your proposal I think you would change the first one to

 1. v is reachable if both k and w are reachable

Arguably this makes sense, because as you say, v is accessed via w, and what's the point of making v reachable if you can't access it? It's just a space leak.

My only worry is how hard this is to implement. Rather than considering w as unconditionally reachable (which is what we do now), you would have to track its reachability, and only consider v reachable when both k and w are reachable. A weak pointer object where only k was reachable would probably need to be put in a semi-dead (zombie?) state, so that we would still run the finalizer when k becomes unreachable. I suspect all this might be more complicated to implement, but maybe there's a simpler way that I'm missing.

Cheers,
Simon
_______________________________________________
ghc-devs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/ghc-devs

Reply via email to