summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--process.c10
-rw-r--r--thread.c1
3 files changed, 15 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 95dcbf6aad..38095e657e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Tue Nov 25 00:08:22 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_fork): stops the timer thread during fork.
+ [ruby-dev:37117]
+
+ * thread.c (rb_thread_start_timer_thread): timer thread needs
+ system_working to be set.
+
Mon Nov 24 23:27:28 2008 Shugo Maeda <shugo@ruby-lang.org>
* strftime.c (rb_strftime): The # flag should work with %a, %A, %b,
diff --git a/process.c b/process.c
index e54e174f28..517b4867b1 100644
--- a/process.c
+++ b/process.c
@@ -975,6 +975,8 @@ void rb_thread_reset_timer_thread(void);
(rb_enable_interrupt(), rb_thread_stop_timer_thread())
#define after_exec() \
(rb_thread_start_timer_thread(), rb_disable_interrupt())
+#define before_fork() before_exec()
+#define after_fork() after_exec()
#include "dln.h"
@@ -2272,7 +2274,8 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg, VALUE fds)
}
}
#endif
- for (; (pid = fork()) < 0; prefork()) {
+ for (; before_fork(), (pid = fork()) < 0; prefork()) {
+ after_fork();
switch (errno) {
case EAGAIN:
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
@@ -2298,7 +2301,6 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg, VALUE fds)
}
}
if (!pid) {
- rb_thread_reset_timer_thread();
if (chfunc) {
#ifdef FD_CLOEXEC
close(ep[0]);
@@ -2314,10 +2316,10 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg, VALUE fds)
_exit(127);
#endif
}
- rb_thread_start_timer_thread();
}
+ after_fork();
#ifdef FD_CLOEXEC
- else if (chfunc) {
+ if (pid && chfunc) {
close(ep[1]);
if ((state = read(ep[0], &err, sizeof(err))) < 0) {
err = errno;
diff --git a/thread.c b/thread.c
index 9c4c6da18b..dad5c1c286 100644
--- a/thread.c
+++ b/thread.c
@@ -2371,6 +2371,7 @@ rb_thread_reset_timer_thread(void)
void
rb_thread_start_timer_thread(void)
{
+ system_working = 1;
rb_thread_create_timer_thread();
}