diff --git a/ChangeLog b/ChangeLog index 6d1c58f244..badb9877da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Mon Nov 26 22:44:24 2012 KOSAKI Motohiro + + * thread.c (rb_thread_terminate_all): use native_sleep() instead + of rb_thread_schedule(). Otherwise, it consume 100% cpu meaninglessly. + [Bug #5368] [ruby-dev:44546] + * thread.c (thread_start_func_2): last sub-thread wakes up main thread. + Mon Nov 26 21:16:04 2012 KOSAKI Motohiro * vm_core.h (RUBY_VM_SET_TIMER_INTERRUPT, RUBY_VM_SET_INTERRUPT) diff --git a/thread.c b/thread.c index 0ff0794785..3fb97d2342 100644 --- a/thread.c +++ b/thread.c @@ -385,7 +385,7 @@ rb_thread_terminate_all(void) while (!rb_thread_alone()) { PUSH_TAG(); if (EXEC_TAG() == 0) { - rb_thread_schedule(); + native_sleep(th, 0); } else { /* ignore exception */ @@ -522,6 +522,9 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s /* delete self other than main thread from living_threads */ if (th != main_th) { st_delete_wrap(th->vm->living_threads, th->self); + if (rb_thread_alone()) { + rb_threadptr_interrupt(main_th); + } } /* wake up joining threads */