Merge pull request #11365 from Bo98/syscommand-queue

system_command: better handle race conditions when interrupting
This commit is contained in:
Bo Anderson 2021-05-11 14:12:21 +01:00 committed by GitHub
commit 2b9fd5460e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -200,23 +200,26 @@ class SystemCommand
write_input_to(raw_stdin)
raw_stdin.close_write
thread_ready_queue = Queue.new
thread_done_queue = Queue.new
line_thread = Thread.new do
Thread.handle_interrupt(ProcessTerminatedInterrupt => :never) do
thread_ready_queue << true
each_line_from [raw_stdout, raw_stderr], &block
end
# Handle race conditions with interrupts
Thread.current.report_on_exception = false
thread_done_queue.pop
rescue ProcessTerminatedInterrupt
nil
end
Thread.pass
end_time = Time.now + @timeout if @timeout
raise Timeout::Error if raw_wait_thr.join(end_time&.remaining).nil?
@status = raw_wait_thr.value
thread_ready_queue.pop
line_thread.raise ProcessTerminatedInterrupt.new
thread_done_queue << true
line_thread.join
rescue Interrupt
Process.kill("INT", pid) if pid && !sudo?