@@ -39,12 +39,14 @@ type DArray{T,N,A} <: AbstractArray{T,N}
39
39
end
40
40
release = (myid () == id[1 ])
41
41
42
- haskey (registry, id) && return registry[id]
42
+ d = d_from_weakref_or_d (id)
43
+ if d === nothing
44
+ d = new (id, dims, pids, indexes, cuts, lp, release)
45
+ end
43
46
44
- d = new (id, dims, pids, indexes, cuts, lp, release)
45
47
if release
46
48
push! (refs, id)
47
- registry[id] = d
49
+ registry[id] = WeakRef (d)
48
50
49
51
# println("Installing finalizer for : ", d.id, ", : ", object_id(d), ", isbits: ", isbits(d))
50
52
finalizer (d, close)
@@ -55,6 +57,12 @@ type DArray{T,N,A} <: AbstractArray{T,N}
55
57
DArray {T,N,A} () where {T,N,A} = new ()
56
58
end
57
59
60
+ function d_from_weakref_or_d (id)
61
+ d = get (registry, id, nothing )
62
+ isa (d, WeakRef) && return d. value
63
+ return d
64
+ end
65
+
58
66
eltype {T} (:: Type{DArray{T}} ) = T
59
67
empty_localpart (T,N,A) = A (Array {T} (ntuple (zero, N)))
60
68
@@ -90,6 +98,7 @@ function DArray(id, init, dims, pids, idxs, cuts)
90
98
A = take! (r)
91
99
if myid () in pids
92
100
d = registry[id]
101
+ d = isa (d, WeakRef) ? d. value : d
93
102
else
94
103
T = eltype (A)
95
104
N = length (dims)
@@ -137,6 +146,7 @@ function ddata(;T::Type=Any, init::Function=I->nothing, pids=workers(), data::Ve
137
146
138
147
if myid () in pids
139
148
d = registry[id]
149
+ d = isa (d, WeakRef) ? d. value : d
140
150
else
141
151
d = DArray {T,1,T} (id, (npids,), pids, idxs, cuts, Nullable {T} ())
142
152
end
@@ -320,7 +330,7 @@ function localpart{T,N,A}(d::DArray{T,N,A})
320
330
return empty_localpart (T,N,A):: A
321
331
end
322
332
323
- return get (registry[d . id] . localpart):: A
333
+ return get (d . localpart):: A
324
334
end
325
335
326
336
localpart (d:: DArray , localidx... ) = localpart (d)[localidx... ]
0 commit comments