From 3e7c34140c4eb7dabd7a0c6176222df795029920 Mon Sep 17 00:00:00 2001 From: mame Date: Thu, 15 Jan 2009 17:27:31 +0000 Subject: [PATCH] * thread.c (rb_thread_execute_interrupts): if signal is already buffered, main thread should wait until timer thread delivers it. * thread.c (timer_thread_function): should defer delivery of a signal if main thread does not yet trap a previous one. [ruby-dev:37676] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21582 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ thread.c | 9 +++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0ecc483e60..d30238784e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Fri Jan 16 02:25:46 2009 Yusuke Endoh + + * thread.c (rb_thread_execute_interrupts): if signal is already + buffered, main thread should wait until timer thread delivers it. + + * thread.c (timer_thread_function): should defer delivery of a signal + if main thread does not yet trap a previous one. [ruby-dev:37676] + Fri Jan 16 02:05:55 2009 Tanaka Akira * ext/socket/socket.c (addrinfo_s_ip): new method AddrInfo.ip. diff --git a/thread.c b/thread.c index 08e957f544..96c74a66b4 100644 --- a/thread.c +++ b/thread.c @@ -1179,6 +1179,10 @@ thread_s_pass(VALUE klass) void rb_thread_execute_interrupts(rb_thread_t *th) { + if (GET_VM()->main_thread == th) { + while (rb_signal_buff_size() && !th->exec_signal) native_thread_yield(); + } + if (th->raised_flag) return; while (th->interrupt_flag) { @@ -2518,13 +2522,14 @@ timer_thread_function(void *arg) { rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */ int sig; + rb_thread_t *mth; /* for time slice */ RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread); /* check signal */ - if ((sig = rb_get_next_signal()) > 0) { - rb_thread_t *mth = vm->main_thread; + mth = vm->main_thread; + if (!mth->exec_signal && (sig = rb_get_next_signal()) > 0) { enum rb_thread_status prev_status = mth->status; thread_debug("main_thread: %s, sig: %d\n", thread_status_name(prev_status), sig);