From 5f0b8afb97d7830de8f04a7d6a39cde660020c69 Mon Sep 17 00:00:00 2001 From: ko1 Date: Tue, 25 Dec 2007 04:16:06 +0000 Subject: * vm_core.h, thread.c, cont.c: add RUBY_VM_SET_INTERRUPT(), RUBY_VM_SET_TIMER_INTERRUPT(), RUBY_VM_INTERRUPTED(). * thread.c, thread_pthread.c, thread_win32.c: fix to ignore time slice event until sleep. * bootstraptest/test_thread.rb: add a test for time limited join test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14654 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- thread_pthread.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'thread_pthread.c') diff --git a/thread_pthread.c b/thread_pthread.c index a511468949..5a3770520f 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -392,6 +392,7 @@ native_sleep(rb_thread_t *th, struct timeval *tv) int prev_status = th->status; struct timespec ts; struct timeval tvn; + struct timeval tve; if (tv) { gettimeofday(&tvn, NULL); @@ -410,15 +411,14 @@ native_sleep(rb_thread_t *th, struct timeval *tv) GVL_UNLOCK_BEGIN(); { pthread_mutex_lock(&th->interrupt_lock); + th->unblock_function = ubf_pthread_cond_signal; + th->unblock_function_arg = th; - if (th->interrupt_flag) { + if (RUBY_VM_INTERRUPTED(th)) { /* interrupted. return immediate */ thread_debug("native_sleep: interrupted before sleep\n"); } else { - th->unblock_function = ubf_pthread_cond_signal; - th->unblock_function_arg = th; - if (tv == 0) { thread_debug("native_sleep: pthread_cond_wait start\n"); pthread_cond_wait(&th->native_thread_data.sleep_cond, @@ -433,14 +433,16 @@ native_sleep(rb_thread_t *th, struct timeval *tv) &th->interrupt_lock, &ts); thread_debug("native_sleep: pthread_cond_timedwait end (%d)\n", r); } - th->unblock_function = 0; - th->unblock_function_arg = 0; } - pthread_mutex_unlock(&th->interrupt_lock); + th->unblock_function = 0; + th->unblock_function_arg = 0; + pthread_mutex_unlock(&th->interrupt_lock); th->status = prev_status; } GVL_UNLOCK_END(); + RUBY_VM_CHECK_INTS(); + thread_debug("native_sleep done\n"); } -- cgit v1.2.3