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 >
