From 84f8da11579b8b655505dc8abffc31c715784794 Mon Sep 17 00:00:00 2001 From: ko1 Date: Sun, 7 Jan 2007 09:47:52 +0000 Subject: * thread.c (rb_thread_stop_timer_thread(), rb_thread_reset_timer_thread(), rb_thread_start_timer_thread()): added. * thread_pthread.ci: add a native_thread_join() and move rb_thread_reset_timer_thread() definition to thread.c. * thread_win32.ci: ditto * process.c: fix before_exec(), after_exec() to stop timer thread (and restart timer thread if exec failed). and fix to reset timer thread information when forked child process starts (to fix [ruby-core:09822]). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 15 +++++++++++++++ process.c | 9 ++++++--- thread.c | 23 ++++++++++++++++++++++- thread_pthread.ci | 17 +++++++++-------- thread_win32.ci | 19 +++++++++---------- 5 files changed, 61 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index a0bbb3eba0..26772b6079 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Sun Jan 7 18:36:05 2007 Koichi Sasada + + * thread.c (rb_thread_stop_timer_thread(), rb_thread_reset_timer_thread(), + rb_thread_start_timer_thread()): added. + + * thread_pthread.ci: add a native_thread_join() and move + rb_thread_reset_timer_thread() definition to thread.c. + + * thread_win32.ci: ditto + + * process.c: fix before_exec(), after_exec() to stop timer thread + (and restart timer thread if exec failed). and fix to reset + timer thread information when forked child process starts + (to fix [ruby-core:09822]). + Sun Jan 7 18:28:17 2007 Koichi Sasada * common.mk: add a "compare" rule and fix MATZRUBY variable diff --git a/process.c b/process.c index 69002fabde..25f62a6327 100644 --- a/process.c +++ b/process.c @@ -891,8 +891,10 @@ proc_detach(VALUE obj, VALUE pid) char *strtok(); #endif -#define before_exec() rb_enable_interrupt() -#define after_exec() rb_disable_interrupt() +#define before_exec() \ + (rb_enable_interrupt(), rb_thread_stop_timer_thread()) +#define after_exec() \ + (rb_thread_start_timer_thread(), rb_disable_interrupt()) extern char *dln_find_exe(const char *fname, const char *path); @@ -1332,6 +1334,7 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg) } } if (!pid) { + rb_thread_reset_timer_thread(); if (chfunc) { #ifdef FD_CLOEXEC close(ep[0]); @@ -1347,7 +1350,7 @@ rb_fork(int *status, int (*chfunc)(void*), void *charg) _exit(127); #endif } - rb_thread_reset_timer_thread(); + rb_thread_start_timer_thread(); } #ifdef FD_CLOEXEC else if (chfunc) { diff --git a/thread.c b/thread.c index 5e0c92d44f..d5dd8ae895 100644 --- a/thread.c +++ b/thread.c @@ -65,7 +65,7 @@ NOINLINE(void yarv_set_stack_end(VALUE **stack_end_p)); static VALUE eKillSignal = INT2FIX(0); static VALUE eTerminateSignal = INT2FIX(1); -static int system_working = 1; +static volatile int system_working = 1; inline static void st_delete_wrap(st_table * table, VALUE key) @@ -1602,6 +1602,27 @@ timer_thread_function(void) } } +void +rb_thread_stop_timer_thread(void) +{ + if (timer_thread_id) { + system_working = 0; + native_thread_join(timer_thread_id); + } +} + +void +rb_thread_reset_timer_thread(void) +{ + timer_thread_id = 0; +} + +void +rb_thread_start_timer_thread(void) +{ + rb_thread_create_timer_thread(); +} + /***/ void diff --git a/thread_pthread.ci b/thread_pthread.ci index 3a3249e531..fe7086dc61 100644 --- a/thread_pthread.ci +++ b/thread_pthread.ci @@ -205,6 +205,15 @@ native_thread_create(yarv_thread_t *th) return err; } +static void +native_thread_join(pthread_t th) +{ + int err = pthread_join(th, 0); + if (err) { + rb_raise(rb_eThreadError, "native_thread_join() failed (%d)", err); + } +} + static void native_thread_apply_priority(yarv_thread_t *th) { @@ -430,7 +439,6 @@ rb_thread_create_timer_thread(void) #ifdef PTHREAD_STACK_MIN pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); #endif - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); err = pthread_create(&timer_thread_id, &attr, thread_timer, 0); if (err != 0) { rb_bug("rb_thread_create_timer_thread: return non-zero (%d)", err); @@ -439,11 +447,4 @@ rb_thread_create_timer_thread(void) rb_disable_interrupt(); /* only timer thread recieve signal */ } -void -rb_thread_reset_timer_thread(void) -{ - timer_thread_id = 0; - rb_thread_create_timer_thread(); -} - #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ diff --git a/thread_win32.ci b/thread_win32.ci index 27550ccf01..2d1cddea18 100644 --- a/thread_win32.ci +++ b/thread_win32.ci @@ -259,6 +259,12 @@ native_thread_create(yarv_thread_t *th) return 0; } +static void +native_thread_join(HANDLE th) +{ + w32_wait_event(th, 0, 0); +} + static void native_thread_apply_priority(yarv_thread_t *th) { @@ -285,7 +291,7 @@ native_thread_interrupt(yarv_thread_t *th) static void timer_thread_function(void); -static HANDLE timer_thread_handle = 0; +static HANDLE timer_thread_id = 0; static unsigned int _stdcall timer_thread_func(void *dummy) @@ -302,16 +308,9 @@ timer_thread_func(void *dummy) void rb_thread_create_timer_thread(void) { - if (timer_thread_handle == 0) { - timer_thread_handle = w32_create_thread(1024, timer_thread_func, 0); + if (timer_thread_id == 0) { + timer_thread_id = w32_create_thread(1024, timer_thread_func, 0); } } -void -rb_thread_reset_timer_thread(void) -{ - timer_thread_handle = 0; - rb_thread_create_timer_thread(); -} - #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ -- cgit v1.2.3