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

ruby-changes:6460

From: nobu <ko1@a...>
Date: Wed, 9 Jul 2008 22:41:53 +0900 (JST)
Subject: [ruby-changes:6460] Ruby:r17976 (trunk): * thread.c (sleep_forever): wait until timed out.

nobu	2008-07-09 22:41:19 +0900 (Wed, 09 Jul 2008)

  New Revision: 17976

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

  Log:
    * thread.c (sleep_forever): wait until timed out.  [ruby-core:17270]

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

Index: thread_win32.c
===================================================================
--- thread_win32.c	(revision 17975)
+++ thread_win32.c	(revision 17976)
@@ -207,17 +207,9 @@
 native_sleep(rb_thread_t *th, struct timeval *tv, int deadlockable)
 {
     int prev_status = th->status;
-    int retry = 0;
-    DWORD msec, ret;
-    struct timeval tvn, limit;
+    DWORD msec;
 
     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 {
@@ -233,9 +225,10 @@
 	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;
@@ -259,17 +252,6 @@
     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 17975)
+++ ChangeLog	(revision 17976)
@@ -1,3 +1,7 @@
+Wed Jul  9 22:41:16 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* thread.c (sleep_forever): wait until timed out.  [ruby-core:17270]
+
 Wed Jul  9 20:58:16 2008  Tanaka Akira  <akr@f...>
 
 	* array.c (rb_ary_fill): don't raise even if length is negative.
@@ -3,9 +7,4 @@
 	  [ruby-core:17483], [ruby-core:17661]
 
-Wed Jul  9 20:36:31 2008  Nobuyoshi Nakada  <nobu@r...>
-
-	* thread_{pthread,win32}.c (native_sleep): wait until timed out.
-	  [ruby-core:17270]
-
 Wed Jul  9 20:18:50 2008  Nobuyoshi Nakada  <nobu@r...>
 
Index: thread_pthread.c
===================================================================
--- thread_pthread.c	(revision 17975)
+++ thread_pthread.c	(revision 17976)
@@ -496,7 +496,6 @@
 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;
 
@@ -520,7 +519,6 @@
     }
 
     thread_debug("native_sleep %ld\n", tv ? tv->tv_sec : -1);
-  sleep_again:
     GVL_UNLOCK_BEGIN();
     {
 	pthread_mutex_lock(&th->interrupt_lock);
@@ -532,7 +530,7 @@
 	    thread_debug("native_sleep: interrupted before sleep\n");
 	}
 	else {
-	    if (tv == 0 || (!retry && ts.tv_sec < tvn.tv_sec /* overflow */)) {
+	    if (tv == 0 || 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,
@@ -542,7 +540,7 @@
 	    }
 	    else {
 		int r;
-		thread_debug("native_sleep: pthread_cond_timedwait start (%ld.%.9ld)\n",
+		thread_debug("native_sleep: pthread_cond_timedwait start (%ld, %ld)\n",
 			     (unsigned long)ts.tv_sec, ts.tv_nsec);
 		r = pthread_cond_timedwait(&th->native_thread_data.sleep_cond,
 					   &th->interrupt_lock, &ts);
@@ -560,17 +558,6 @@
     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");
 }
Index: thread.c
===================================================================
--- thread.c	(revision 17975)
+++ thread.c	(revision 17976)
@@ -718,9 +718,47 @@
 }
 
 static void
+getclockofday(struct timeval *tp)
+{
+#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
+    struct timespec ts;
+
+    if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
+	tp->tv_sec = ts.tv_sec;
+	tp->tv_usec = ts.tv_nsec / 1000;
+    } else
+#endif
+    {
+        gettimeofday(tp, NULL);
+    }
+}
+
+static void
 sleep_timeval(rb_thread_t *th, struct timeval tv)
 {
-    native_sleep(th, &tv, 0);
+    struct timeval to, tvn;
+
+    getclockofday(&to);
+    to.tv_sec += tv.tv_sec;
+    if ((to.tv_usec += tv.tv_usec) >= 1000000) {
+	to.tv_sec++;
+	to.tv_usec -= 1000000;
+    }
+
+    for (;;) {
+	native_sleep(th, &tv, 0);
+	getclockofday(&tvn);
+	if (to.tv_sec < tvn.tv_sec) break;
+	if (to.tv_sec == tvn.tv_sec && to.tv_usec <= tvn.tv_usec) break;
+	thread_debug("sleep_timeval: %ld.%.6ld > %ld.%.6ld\n",
+		     (long)to.tv_sec, to.tv_usec,
+		     (long)tvn.tv_sec, tvn.tv_usec);
+	tv.tv_sec = to.tv_sec - tvn.tv_sec;
+	if ((tv.tv_usec = to.tv_usec - tvn.tv_usec) < 0) {
+	    --tv.tv_sec;
+	    tv.tv_usec += 1000000;
+	}
+    }
 }
 
 void

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

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