[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]