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

ruby-changes:6456

From: nobu <ko1@a...>
Date: Wed, 9 Jul 2008 20:35:24 +0900 (JST)
Subject: [ruby-changes:6456] Ruby:r17972 (trunk): * thread_{pthread,win32}.c (native_sleep): wait until timed out.

nobu	2008-07-09 20:35:06 +0900 (Wed, 09 Jul 2008)

  New Revision: 17972

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=17972

  Log:
    * thread_{pthread,win32}.c (native_sleep): wait until timed out.

  Modified files:
    trunk/ChangeLog
    trunk/thread_pthread.c
    trunk/thread_win32.c

Index: thread_win32.c
===================================================================
--- thread_win32.c	(revision 17971)
+++ thread_win32.c	(revision 17972)
@@ -207,9 +207,17 @@
 native_sleep(rb_thread_t *th, struct timeval *tv, int deadlockable)
 {
     int prev_status = th->status;
-    DWORD msec;
+    int retry = 0;
+    DWORD msec, ret;
+    struct timeval tvn, limit;
 
     if (tv) {
+	gettimeofday(&limit, NULL);
+	limit.tv_sec += tv->tv_sec;
+	if ((limit.tv_usec += tv->tv_usec) >= 1000000) {
+	    limit.tv_sec += limit.tv_usec / 1000000;
+	    limit.tv_usec %= 1000000;
+	}
 	msec = tv->tv_sec * 1000 + tv->tv_usec / 1000;
     }
     else {
@@ -225,10 +233,9 @@
 	th->status = THREAD_STOPPED;
     }
 
+  sleep_again:
     GVL_UNLOCK_BEGIN();
     {
-	DWORD ret;
-
 	native_mutex_lock(&th->interrupt_lock);
 	th->unblock.func = ubf_handle;
 	th->unblock.arg = th;
@@ -252,6 +259,17 @@
     th->status = prev_status;
     if (!tv && deadlockable) th->vm->sleeper--;
     RUBY_VM_CHECK_INTS();
+    if (tv) {
+	gettimeofday(&tvn, NULL);
+	if (limit.tv_sec > tvn.tv_sec ||
+	    (limit.tv_sec == tvn.tv_sec && limit.tv_usec > tvn.tv_usec)) {
+	    thread_debug("native_sleep: %ld.%.6ld > %ld.%.6ld\n",
+			 (long)limit.tv_sec, limit.tv_usec,
+			 (long)tvn.tv_sec, tvn.tv_usec);
+	    retry = 1;
+	    goto sleep_again;
+	}
+    }
 }
 
 static int
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 17971)
+++ ChangeLog	(revision 17972)
@@ -1,3 +1,7 @@
+Wed Jul  9 20:35:03 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* thread_{pthread,win32}.c (native_sleep): wait until timed out.
+
 Wed Jul  9 20:18:50 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* configure.in (rb_cv_va_args_macro): check for __VA_ARGS__.
Index: thread_pthread.c
===================================================================
--- thread_pthread.c	(revision 17971)
+++ thread_pthread.c	(revision 17972)
@@ -496,6 +496,7 @@
 native_sleep(rb_thread_t *th, struct timeval *tv, int deadlockable)
 {
     int prev_status = th->status;
+    int retry = 0;
     struct timespec ts;
     struct timeval tvn;
 
@@ -519,6 +520,7 @@
     }
 
     thread_debug("native_sleep %ld\n", tv ? tv->tv_sec : -1);
+  sleep_again:
     GVL_UNLOCK_BEGIN();
     {
 	pthread_mutex_lock(&th->interrupt_lock);
@@ -530,7 +532,7 @@
 	    thread_debug("native_sleep: interrupted before sleep\n");
 	}
 	else {
-	    if (tv == 0 || ts.tv_sec < tvn.tv_sec /* overflow */ ) {
+	    if (tv == 0 || (!retry && ts.tv_sec < tvn.tv_sec /* overflow */)) {
 		int r;
 		thread_debug("native_sleep: pthread_cond_wait start\n");
 		r = pthread_cond_wait(&th->native_thread_data.sleep_cond,
@@ -540,7 +542,7 @@
 	    }
 	    else {
 		int r;
-		thread_debug("native_sleep: pthread_cond_timedwait start (%ld, %ld)\n",
+		thread_debug("native_sleep: pthread_cond_timedwait start (%ld.%.9ld)\n",
 			     (unsigned long)ts.tv_sec, ts.tv_nsec);
 		r = pthread_cond_timedwait(&th->native_thread_data.sleep_cond,
 					   &th->interrupt_lock, &ts);
@@ -558,6 +560,17 @@
     th->status = prev_status;
     if (!tv && deadlockable) th->vm->sleeper--;
     RUBY_VM_CHECK_INTS();
+    if (tv) {
+	gettimeofday(&tvn, NULL);
+	if (ts.tv_sec > tvn.tv_sec ||
+	    (ts.tv_sec == tvn.tv_sec && ts.tv_nsec > tvn.tv_usec * 1000)) {
+	    thread_debug("native_sleep: %ld.%.9ld > %ld.%.6ld\n",
+			 (long)ts.tv_sec, ts.tv_nsec,
+			 (long)tvn.tv_sec, tvn.tv_usec);
+	    retry = 1;
+	    goto sleep_again;
+	}
+    }
 
     thread_debug("native_sleep done\n");
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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