This email is likely to get more attention on julia-dev. Would you mind
reposting there?


On Wed, May 28, 2014 at 12:32 AM, Tony Fong <[email protected]> wrote:

> Hello,
>
> I'm trying to write a finalizer for an object that is also used as the key
> in a WeakKeyDict{k,v}, and I'm having a bit of trouble getting it to work.
>
> The context is that I need to use the WeakKeyDict to handle a bunch of
> additional cleanup before the WeakKeyDict's deleter handles the removal of
> the key. So I have to run my program-specific finalizer before the
> WeakKeyDict's finalizer.
>
> A couple questions:
>
>    1. Are finalizers "stackable" on the same object? if not, should it?
>    if they are, is the order LIFO (the last function fed into finalizer(x,f)
>    gets called first), FIFO or random (no guarantee)?
>    2. There's another approach which may avoid answering #1 altogether,
>    which is to add a deleter_wrapper field (::Function, default identity) to
>    WeakKeyDict during set up, like so:
>
> function add_weak_key(t::Dict, k, v)
>     if is(t.deleter, identity)
>         if t.delete_wrapper != identity
>             t.deleter = x->(t.deleter_wrapper(x); weak_key_delete!(t,x))
>         else
>             t.deleter = x->weak_key_delete!(t, x)
>         end
>     end
>     t[WeakRef(k)] = v
>     # TODO: it might be better to avoid the finalizer, allow
>     # wiped WeakRefs to remain in the table, and delete them as
>     # they are discovered by getindex and setindex!.
>     finalizer(k, t.deleter)
>     return t
> end
>
> Thanks for your consideration.
>
> T
>

Reply via email to