diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-11 00:39:16 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-08-11 00:39:16 +0000 |
commit | 4197f337b9881accd21c15ca0f225dae752f5fd3 (patch) | |
tree | 357766f994266743569616b34bca4125e6caff9d /signal.c | |
parent | 01d1a35a77f6dc2e522d27379d5a52b8e8a1e9eb (diff) |
merges r32345 from trunk into ruby_1_9_2.
--
* thread.c (rb_threadptr_check_signal): only wake up main thread.
* thread.c (rb_threadptr_execute_interrupts_common): check signal
deliverly if it is main thread.
fixes [ruby-dev:44005] [Ruby 1.9 - Bug #4950]
* bootstraptest/test_fork.rb: add a test for above.
* signal.c (rb_get_next_signal): skip if signal_buff is empty.
(check signal_buff.size first)
* vm_core.h: remove unused variable rb_thread_t::exec_signal.
* thread.c (rb_thread_check_trap_pending): check
rb_signal_buff_size() because rb_thread_t::exec_signal
is no longer available.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@32926 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r-- | signal.c | 20 |
1 files changed, 11 insertions, 9 deletions
@@ -566,16 +566,18 @@ rb_get_next_signal(void) { int i, sig = 0; - for (i=1; i<RUBY_NSIG; i++) { - if (signal_buff.cnt[i] > 0) { - rb_disable_interrupt(); - { - ATOMIC_DEC(signal_buff.cnt[i]); - ATOMIC_DEC(signal_buff.size); + if (signal_buff.size != 0) { + for (i=1; i<RUBY_NSIG; i++) { + if (signal_buff.cnt[i] > 0) { + rb_disable_interrupt(); + { + ATOMIC_DEC(signal_buff.cnt[i]); + ATOMIC_DEC(signal_buff.size); + } + rb_enable_interrupt(); + sig = i; + break; } - rb_enable_interrupt(); - sig = i; - break; } } return sig; |