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/