ruby-changes:8625
From: nobu <ko1@a...>
Date: Sun, 9 Nov 2008 00:31:26 +0900 (JST)
Subject: [ruby-changes:8625] Ruby:r20160 (trunk): * thread_pthread.c (thread_timer): checks working flags again.
nobu 2008-11-09 00:31:05 +0900 (Sun, 09 Nov 2008) New Revision: 20160 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=20160 Log: * thread_pthread.c (thread_timer): checks working flags again. Modified files: trunk/ChangeLog trunk/thread.c trunk/thread_pthread.c trunk/thread_win32.c Index: thread_win32.c =================================================================== --- thread_win32.c (revision 20159) +++ thread_win32.c (revision 20160) @@ -558,6 +558,15 @@ } } -#define native_stop_timer_thread() (CloseHandle(timer_thread_lock), timer_thread_lock = 0) +static int +native_stop_timer_thread(void) +{ + int stopped = --system_working <= 0; + if (stopped) { + CloseHandle(timer_thread_lock); + timer_thread_lock = 0; + } + return stopped; +} #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ Index: ChangeLog =================================================================== --- ChangeLog (revision 20159) +++ ChangeLog (revision 20160) @@ -1,3 +1,7 @@ +Sun Nov 9 00:30:52 2008 Nobuyoshi Nakada <nobu@r...> + + * thread_pthread.c (thread_timer): checks working flags again. + Sun Nov 9 00:02:01 2008 Takeyuki FUJIOKA <xibbar@r...> * lib/cgi/session/pstore.rb: fix indentation. Index: thread_pthread.c =================================================================== --- thread_pthread.c (revision 20159) +++ thread_pthread.c (revision 20160) @@ -679,9 +679,9 @@ int err; native_mutex_lock(&timer_thread_lock); - native_cond_signal(&timer_thread_cond); + native_cond_broadcast(&timer_thread_cond); #define WAIT_FOR_10MS() native_cond_timedwait(&timer_thread_cond, &timer_thread_lock, get_ts(&ts, PER_NANO/100)) - while ((err = WAIT_FOR_10MS()) != 0 && err != EINTR) { + while (system_working > 0 && (err = WAIT_FOR_10MS()) != 0 && err != EINTR) { if (err != ETIMEDOUT) { rb_bug("thread_timer/timedwait: %d", err); } @@ -729,12 +729,17 @@ rb_disable_interrupt(); /* only timer thread recieve signal */ } -static void +static int native_stop_timer_thread(void) { + int stopped; native_mutex_lock(&timer_thread_lock); - native_cond_signal(&timer_thread_cond); + stopped = --system_working <= 0; + if (stopped) { + native_cond_signal(&timer_thread_cond); + } native_mutex_unlock(&timer_thread_lock); + return stopped; } #endif /* THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION */ Index: thread.c =================================================================== --- thread.c (revision 20159) +++ thread.c (revision 20160) @@ -75,6 +75,7 @@ static const VALUE eKillSignal = INT2FIX(0); static const VALUE eTerminateSignal = INT2FIX(1); +static volatile int system_working = 1; inline static void st_delete_wrap(st_table *table, st_data_t key) @@ -2355,8 +2356,7 @@ void rb_thread_stop_timer_thread(void) { - if (timer_thread_id) { - native_stop_timer_thread(); + if (timer_thread_id && native_stop_timer_thread()) { native_thread_join(timer_thread_id); timer_thread_id = 0; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/