From f5502f69f05570d0ed426f19b90ac5fb0c1777a4 Mon Sep 17 00:00:00 2001 From: Hans-Peter Suter Date: Sun, 3 Nov 2019 22:29:39 +0100 Subject: [PATCH 1/2] fix deadlock in WeakKeyDict iterate! method The command `x = WeakKeyDict(:a => 4)` followed by `push!(x, :b => 2)` gives a deadlock. The reason is a `lock` command in the iterate! method where the registered finalizer function with `unlock` never got called. --- base/weakkeydict.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/base/weakkeydict.jl b/base/weakkeydict.jl index db1b60e27d771..29fb5c53d6424 100644 --- a/base/weakkeydict.jl +++ b/base/weakkeydict.jl @@ -126,7 +126,11 @@ end function iterate(t::WeakKeyDict{K,V}, state) where V where K gc_token = first(state) y = iterate(t.ht, tail(state)...) - y === nothing && return nothing + if y === nothing + gc_token[] = true + finalize(gc_token) + return nothing + end wkv, i = y kv = Pair{K,V}(wkv[1].value::K, wkv[2]) return (kv, (gc_token, i)) From c7e2f1f100977fe9213fc9e7efac04c7bd42e6c1 Mon Sep 17 00:00:00 2001 From: Hans-Peter Suter Date: Sun, 3 Nov 2019 22:58:20 +0100 Subject: [PATCH 2/2] clarify that objects may be garbage collected --- base/weakkeydict.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/weakkeydict.jl b/base/weakkeydict.jl index 29fb5c53d6424..dd5763ac41da0 100644 --- a/base/weakkeydict.jl +++ b/base/weakkeydict.jl @@ -6,7 +6,7 @@ WeakKeyDict([itr]) `WeakKeyDict()` constructs a hash table where the keys are weak -references to objects, and thus may be garbage collected even when +references to objects which may be garbage collected even when referenced in a hash table. See [`Dict`](@ref) for further help. Note, unlike [`Dict`](@ref),