mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Thread#value: handle threads killed by a fork
[Bug #18902] When a thread is killed because we forked, the `value` if left to `Qundef`. Returning it woudl crash the VM.
This commit is contained in:
parent
7dd0a22588
commit
65ae2bb2e0
Notes:
git
2022-07-08 02:49:44 +09:00
2 changed files with 18 additions and 0 deletions
|
@ -1249,6 +1249,20 @@ q.pop
|
||||||
assert_predicate(status, :success?, bug9751)
|
assert_predicate(status, :success?, bug9751)
|
||||||
end if Process.respond_to?(:fork)
|
end if Process.respond_to?(:fork)
|
||||||
|
|
||||||
|
def test_fork_value
|
||||||
|
bug18902 = "[Bug #18902]"
|
||||||
|
th = Thread.start { sleep 2 }
|
||||||
|
begin
|
||||||
|
pid = fork do
|
||||||
|
th.value
|
||||||
|
end
|
||||||
|
_, status = Process.wait2(pid)
|
||||||
|
assert_predicate(status, :success?, bug18902)
|
||||||
|
ensure
|
||||||
|
th.kill
|
||||||
|
end
|
||||||
|
end if Process.respond_to?(:fork)
|
||||||
|
|
||||||
def test_fork_while_locked
|
def test_fork_while_locked
|
||||||
m = Thread::Mutex.new
|
m = Thread::Mutex.new
|
||||||
thrs = []
|
thrs = []
|
||||||
|
|
4
thread.c
4
thread.c
|
@ -1214,6 +1214,10 @@ thread_value(VALUE self)
|
||||||
{
|
{
|
||||||
rb_thread_t *th = rb_thread_ptr(self);
|
rb_thread_t *th = rb_thread_ptr(self);
|
||||||
thread_join(th, Qnil, 0);
|
thread_join(th, Qnil, 0);
|
||||||
|
if (th->value == Qundef) {
|
||||||
|
// If the thread is dead because we forked th->value is still Qundef.
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
return th->value;
|
return th->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue