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/