Actions
Bug #14998
closedRace conditions in MonitorMixin when interrupted
Description
From https://bugs.ruby-lang.org/issues/14859#note-9
The code of MonitorMixin#wait is:
def wait(timeout = nil)
@monitor.__send__(:mon_check_owner)
count = @monitor.__send__(:mon_exit_for_cond)
begin
@cond.wait(@monitor.instance_variable_get(:@mon_mutex), timeout)
return true
ensure
# What if Thread#raise happens here?
@monitor.__send__(:mon_enter_for_cond, count)
end
end
Probably this code needs to carefully use Thread.handle_interrupt.
Updated by shugo (Shugo Maeda) about 6 years ago
Eregon (Benoit Daloze) wrote:
From https://bugs.ruby-lang.org/issues/14859#note-9
The code of MonitorMixin#wait is:
def wait(timeout = nil) @monitor.__send__(:mon_check_owner) count = @monitor.__send__(:mon_exit_for_cond) begin @cond.wait(@monitor.instance_variable_get(:@mon_mutex), timeout) return true ensure # What if Thread#raise happens here? @monitor.__send__(:mon_enter_for_cond, count) end end
Probably this code needs to carefully use Thread.handle_interrupt.
How about the following code?
def wait(timeout = nil)
Thread.handle_interrupt(Exception => :never) do
@monitor.__send__(:mon_check_owner)
count = @monitor.__send__(:mon_exit_for_cond)
begin
Thread.handle_interrupt(Exception => :immediate) do
@cond.wait(@monitor.instance_variable_get(:@mon_mutex), timeout)
end
return true
ensure
@monitor.__send__(:mon_enter_for_cond, count)
end
end
end
Updated by shugo (Shugo Maeda) almost 6 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r66061.
lib/monitor.rb: avoid race conditions by Thread.handle_interrupt
Suggested by Benoit Daloze. [ruby-core:88502] [Bug #14998]
Actions
Like0
Like0Like0