diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | eval.c | 32 | ||||
-rw-r--r-- | test/ruby/test_signal.rb | 7 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 40 insertions, 13 deletions
@@ -1,3 +1,15 @@ +Tue Nov 17 16:22:22 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * eval.c (rb_thread_start_0, rb_thread_start_1): should call star + timer after added new thread to thread list. [ruby-core:25613] + +Tue Nov 17 16:22:22 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * eval.c (rb_thread_start_timer): start to catch SIGVTALRM together + with timer thread. [ruby-core:25606] + + * eval.c (rb_thread_atfork): stop timer thread. + Tue Nov 17 16:04:02 2009 Marc-Andre Lafortune <ruby-core@marc-andre.ca> * lib/cgi/cookie.rb (value): Keep CGI::Cookie#value in sync with the @@ -12244,6 +12244,12 @@ rb_thread_alloc(klass) static int thread_init; +#if defined(POSIX_SIGNAL) +#define CATCH_VTALRM() posix_signal(SIGVTALRM, catch_timer) +#else +#define CATCH_VTALRM() signal(SIGVTALRM, catch_timer) +#endif + #if defined(_THREAD_SAFE) static void catch_timer(sig) @@ -12327,6 +12333,8 @@ rb_thread_start_timer() static pthread_cond_t start = PTHREAD_COND_INITIALIZER; if (thread_init) return; + if (rb_thread_alone()) return; + CATCH_VTALRM(); args[0] = &time_thread; args[1] = &start; safe_mutex_lock(&time_thread.lock); @@ -12368,6 +12376,8 @@ rb_thread_start_timer() struct itimerval tval; if (thread_init) return; + if (rb_thread_alone()) return; + CATCH_VTALRM(); tval.it_interval.tv_sec = 0; tval.it_interval.tv_usec = 10000; tval.it_value = tval.it_interval; @@ -12391,6 +12401,14 @@ rb_thread_stop_timer() int rb_thread_tick = THREAD_TICK; #endif +#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE) +#define START_TIMER() (thread_init ? (void)0 : rb_thread_start_timer()) +#define STOP_TIMER() (rb_thread_stop_timer()) +#else +#define START_TIMER() ((void)0) +#define STOP_TIMER() ((void)0) +#endif + static VALUE rb_thread_start_0(fn, arg, th) VALUE (*fn)(); @@ -12408,18 +12426,6 @@ rb_thread_start_0(fn, arg, th) "can't start a new thread (frozen ThreadGroup)"); } - if (!thread_init) { -#if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE) -#if defined(POSIX_SIGNAL) - posix_signal(SIGVTALRM, catch_timer); -#else - signal(SIGVTALRM, catch_timer); -#endif - - rb_thread_start_timer(); -#endif - } - if (THREAD_SAVE_CONTEXT(curr_thread)) { return thread; } @@ -12442,6 +12448,7 @@ rb_thread_start_0(fn, arg, th) th->priority = curr_thread->priority; th->thgroup = curr_thread->thgroup; } + START_TIMER(); PUSH_TAG(PROT_THREAD); if ((state = EXEC_TAG()) == 0) { @@ -13167,6 +13174,7 @@ rb_thread_atfork() main_thread = curr_thread; curr_thread->next = curr_thread; curr_thread->prev = curr_thread; + STOP_TIMER(); } diff --git a/test/ruby/test_signal.rb b/test/ruby/test_signal.rb index 43e16b8c79..84db7fa1f3 100644 --- a/test/ruby/test_signal.rb +++ b/test/ruby/test_signal.rb @@ -65,4 +65,11 @@ class TestSignal < Test::Unit::TestCase w0.close end end + + def test_child_vtalrm + return unless have_fork? # snip this test + pid = fork {100_000.times{ 1+1 }} + pid, status = Process.wait2(pid) + assert_equal(false, status.signaled?, '[ruby-core:25606]') + end end @@ -2,7 +2,7 @@ #define RUBY_RELEASE_DATE "2009-11-17" #define RUBY_VERSION_CODE 187 #define RUBY_RELEASE_CODE 20091117 -#define RUBY_PATCHLEVEL 209 +#define RUBY_PATCHLEVEL 210 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 8 |