Skip to content

Commit 200e180

Browse files
committed
1 parent 371527c commit 200e180

File tree

4 files changed

+14
-36
lines changed

4 files changed

+14
-36
lines changed

src/pool.jl

+6-28
Original file line numberDiff line numberDiff line change
@@ -24,39 +24,17 @@ end
2424

2525
Base.unlock(nrl::NonReentrantLock) = unlock(nrl.rl)
2626

27-
# the above lock is taken around code that might gc, which might reenter through finalizers.
28-
# avoid that by temporarily disabling finalizers running concurrently on this thread.
29-
enable_finalizers(on::Bool) = ccall(:jl_gc_enable_finalizers, Cvoid,
30-
(Ptr{Cvoid}, Int32,), Core.getptls(), on)
31-
macro safe_lock(l, ex)
32-
quote
33-
temp = $(esc(l))
34-
lock(temp)
35-
enable_finalizers(false)
36-
try
37-
$(esc(ex))
38-
finally
39-
unlock(temp)
40-
enable_finalizers(true)
41-
end
42-
end
43-
end
44-
45-
# if we actually want to acquire these locks from a finalizer, we can't just wait on them
46-
# (which might cause a task switch). as the lock can only be taken by another thread that
47-
# should be running, and not a concurrent task we'd need to switch to, we can safely spin.
48-
macro safe_lock_spin(l, ex)
27+
# a safe way to acquire locks from finalizers, where we can't wait (which switches tasks)
28+
macro spinlock(l, ex)
4929
quote
5030
temp = $(esc(l))
5131
while !trylock(temp)
5232
# we can't yield here
5333
end
54-
enable_finalizers(false) # retains compatibility with non-finalizer callers
5534
try
5635
$(esc(ex))
5736
finally
5837
unlock(temp)
59-
enable_finalizers(true)
6038
end
6139
end
6240
end
@@ -299,7 +277,7 @@ a [`OutOfGPUMemoryError`](@ref) if the allocation request cannot be satisfied.
299277

300278
# record the memory block
301279
ptr = pointer(block)
302-
@safe_lock allocated_lock begin
280+
@lock allocated_lock begin
303281
@assert !haskey(allocated[dev], ptr)
304282
allocated[dev][ptr] = block, 1
305283
end
@@ -337,7 +315,7 @@ multiple calls to `free` before this buffer is put back into the memory pool.
337315
dev = device()
338316

339317
# look up the memory block
340-
@safe_lock_spin allocated_lock begin
318+
@spinlock allocated_lock begin
341319
block, refcount = allocated[dev][ptr]
342320
allocated[dev][ptr] = block, refcount+1
343321
end
@@ -365,7 +343,7 @@ Releases a buffer pointed to by `ptr` to the memory pool.
365343
# so perform our own error handling.
366344
try
367345
# look up the memory block, and bail out if its refcount isn't 1
368-
block = @safe_lock_spin allocated_lock begin
346+
block = @spinlock allocated_lock begin
369347
block, refcount = allocated[dev][ptr]
370348
if refcount == 1
371349
delete!(allocated[dev], ptr)
@@ -473,7 +451,7 @@ end
473451

474452
## utilities
475453

476-
used_memory(dev=device()) = @safe_lock allocated_lock begin
454+
used_memory(dev=device()) = @lock allocated_lock begin
477455
mapreduce(sizeof, +, values(allocated[dev]); init=0)
478456
end
479457

src/pool/binned.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ end
8585

8686
# repopulate the "available" pools from the list of freed blocks
8787
function pool_repopulate(dev)
88-
blocks = @safe_lock freed_lock begin
88+
blocks = @lock freed_lock begin
8989
isempty(freed[dev]) && return
9090
blocks = Set(freed[dev])
9191
empty!(freed[dev])
@@ -232,7 +232,7 @@ function pool_free(dev, block)
232232

233233
# we don't do any work here to reduce pressure on the GC (spending time in finalizers)
234234
# and to simplify locking (preventing concurrent access during GC interventions)
235-
@safe_lock_spin freed_lock begin
235+
@spinlock freed_lock begin
236236
push!(freed[dev], block)
237237
end
238238
end
@@ -245,7 +245,7 @@ function pool_init()
245245
end
246246

247247
function cached_memory(dev=device())
248-
sz = @safe_lock freed_lock mapreduce(sizeof, +, freed[dev]; init=0)
248+
sz = @lock freed_lock mapreduce(sizeof, +, freed[dev]; init=0)
249249
@lock pool_lock for (pid, pl) in enumerate(pools_avail[dev])
250250
bytes = poolsize(pid)
251251
sz += bytes * length(pl)

src/pool/simple.jl

+2-2
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ end
105105
function pool_free(dev, block)
106106
# we don't do any work here to reduce pressure on the GC (spending time in finalizers)
107107
# and to simplify locking (preventing concurrent access during GC interventions)
108-
@safe_lock_spin freed_lock begin
108+
@spinlock freed_lock begin
109109
push!(freed[dev], block)
110110
end
111111
end
@@ -116,7 +116,7 @@ function pool_init()
116116
end
117117

118118
function cached_memory(dev=device())
119-
sz = @safe_lock freed_lock mapreduce(sizeof, +, freed[dev]; init=0)
119+
sz = @lock freed_lock mapreduce(sizeof, +, freed[dev]; init=0)
120120
sz += @lock pool_lock mapreduce(sizeof, +, pool[dev]; init=0)
121121
return sz
122122
end

src/pool/split.jl

+3-3
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ end
151151

152152
# repopulate the pools from the list of freed blocks
153153
function pool_repopulate(dev)
154-
blocks = @safe_lock freed_lock begin
154+
blocks = @lock freed_lock begin
155155
isempty(freed[dev]) && return
156156
blocks = Set(freed[dev])
157157
empty!(freed[dev])
@@ -304,7 +304,7 @@ function pool_free(dev, block)
304304
# and to simplify locking (preventing concurrent access during GC interventions)
305305
block.state == ALLOCATED || error("Cannot free a $(block.state) block")
306306
block.state = FREED
307-
@safe_lock_spin freed_lock begin
307+
@spinlock freed_lock begin
308308
push!(freed[dev], block)
309309
end
310310
end
@@ -329,7 +329,7 @@ function pool_reclaim(dev, sz::Int=typemax(Int))
329329
end
330330

331331
function cached_memory(dev=device())
332-
sz = @safe_lock freed_lock mapreduce(sizeof, +, freed[dev]; init=0)
332+
sz = @lock freed_lock mapreduce(sizeof, +, freed[dev]; init=0)
333333
@lock pool_lock for pool in (pool_small[dev], pool_large[dev], pool_huge[dev])
334334
sz += mapreduce(sizeof, +, pool; init=0)
335335
end

0 commit comments

Comments
 (0)