Symptomatic treatment for `rb_thread_terminate_all` freeze

Under uncertain condition, `rb_thread_terminate_all` gets stuck.  `make
test-all TESTOPTS="test/ruby/test_gc.rb -n test_interrupt_in_finalizer`
fails very rarely (only once every thousand runs).  This IS a bug, but
seems difficult to fix it soon.

This commit makes `rb_thread_terminate_all` wake up every one second,
instead of waiting forever, which mitigates the unuseful freeze.
This is not an essential solution for the bug, though.  I'll create a
ticket with how to reproduce the original issue.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60694 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
mame 2017-11-07 06:36:07 +00:00
Родитель 8ea78d66a1
Коммит a798e49f57
1 изменённых файлов: 4 добавлений и 1 удалений

Просмотреть файл

@ -476,6 +476,8 @@ rb_threadptr_unlock_all_locking_mutexes(rb_thread_t *th)
}
}
static struct timeval double2timeval(double d);
void
rb_thread_terminate_all(void)
{
@ -499,12 +501,13 @@ rb_thread_terminate_all(void)
terminate_all(vm, th);
while (vm_living_thread_num(vm) > 1) {
struct timeval tv = double2timeval(1.0);
/*
* Thread exiting routine in thread_start_func_2 notify
* me when the last sub-thread exit.
*/
sleeping = 1;
native_sleep(th, 0);
native_sleep(th, &tv);
RUBY_VM_CHECK_INTS_BLOCKING(ec);
sleeping = 0;
}