summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-17 07:32:15 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-17 07:32:15 +0000
commit8162d69dda2e584cdaa1bd50eebce1648454ebe4 (patch)
tree70196d82abb8e70f3872dd54cafe3d16fa4dea74
parenteaa8ca6b78be62f74ccb79f91631c07e82e5bb2a (diff)
merge revision(s) 24958,24979:
* 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. * eval.c (rb_thread_start_0, rb_thread_start_1): should call star timer after added new thread to thread list. [ruby-core:25613] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@25819 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog12
-rw-r--r--eval.c32
-rw-r--r--test/ruby/test_signal.rb7
-rw-r--r--version.h2
4 files changed, 40 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 18f64f81e3..087f09b4eb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/eval.c b/eval.c
index 37c460da80..ba15931e69 100644
--- a/eval.c
+++ b/eval.c
@@ -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
diff --git a/version.h b/version.h
index f7794c1bfd..cf30b9b39a 100644
--- a/version.h
+++ b/version.h
@@ -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