Skip to content

Commit

Permalink
process: ensure uvfinalize and _uv_close_cb are synchronized
Browse files Browse the repository at this point in the history
There appeared to be a possibility they could race and the data field
might already be destroyed before we reached the close callback,
from looking at the state of the program when reproducing #44460.

This is because the uv_return_spawn set the handle to NULL, which later
can cause the uvfinalize to exit early (if the finalizer gets run on
another thread, since we have disabled finalizers on our thread). Then
the GC can reap the julia Process object prior to uv_close cleaning up
the object. We solve this by calling disassociate_julia_struct before
dropping the reference to the handle. But then we also fully address any
remaining race condition by having uvfinalize acquire a lock also.

Fixes #44460
  • Loading branch information
vtjnash committed Mar 5, 2022
1 parent 2349f0a commit 622a181
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions base/process.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,13 @@ pipe_writer(p::ProcessChain) = p.in
# release ownership of the libuv handle
function uvfinalize(proc::Process)
if proc.handle != C_NULL
disassociate_julia_struct(proc.handle)
ccall(:jl_close_uv, Cvoid, (Ptr{Cvoid},), proc.handle)
proc.handle = C_NULL
iolock_begin()
if proc.handle != C_NULL
disassociate_julia_struct(proc.handle)
ccall(:jl_close_uv, Cvoid, (Ptr{Cvoid},), proc.handle)
proc.handle = C_NULL
end
iolock_end()
end
nothing
end
Expand All @@ -52,6 +56,7 @@ function uv_return_spawn(p::Ptr{Cvoid}, exit_status::Int64, termsignal::Int32)
proc = unsafe_pointer_to_objref(data)::Process
proc.exitcode = exit_status
proc.termsignal = termsignal
disassociate_julia_struct(proc) # ensure that data field is set to C_NULL
ccall(:jl_close_uv, Cvoid, (Ptr{Cvoid},), proc.handle)
proc.handle = C_NULL
lock(proc.exitnotify)
Expand Down

0 comments on commit 622a181

Please sign in to comment.