1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* thread_pthread.c (lock_func): should not check interrupts in

blocking region.  [ruby-dev:34378]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15990 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2008-04-13 09:52:29 +00:00
parent db0c3eb8c0
commit 31a060f7bd
3 changed files with 21 additions and 12 deletions

View file

@ -1,3 +1,8 @@
Sun Apr 13 18:52:27 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread_pthread.c (lock_func): should not check interrupts in
blocking region. [ruby-dev:34378]
Sat Apr 12 12:41:49 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> Sat Apr 12 12:41:49 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (ruby_exec_node, ruby_run_node), ruby.c (process_options): * eval.c (ruby_exec_node, ruby_run_node), ruby.c (process_options):

View file

@ -2317,23 +2317,23 @@ rb_mutex_trylock(VALUE self)
return locked; return locked;
} }
static VALUE static int
lock_func(rb_thread_t *th, mutex_t *mutex) lock_func(rb_thread_t *th, mutex_t *mutex)
{ {
int interrupted = Qfalse;
native_mutex_lock(&mutex->lock); native_mutex_lock(&mutex->lock);
while (mutex->th) { while (mutex->th || (mutex->th = th, 0)) {
mutex->cond_waiting++; mutex->cond_waiting++;
native_cond_wait(&mutex->cond, &mutex->lock); native_cond_wait(&mutex->cond, &mutex->lock);
if (th->interrupt_flag) { if (th->interrupt_flag) {
native_mutex_unlock(&mutex->lock); interrupted = Qtrue;
RUBY_VM_CHECK_INTS(); break;
native_mutex_lock(&mutex->lock);
} }
} }
mutex->th = th;
native_mutex_unlock(&mutex->lock); native_mutex_unlock(&mutex->lock);
return Qnil; return interrupted;
} }
static void static void
@ -2364,11 +2364,15 @@ rb_mutex_lock(VALUE self)
GetMutexPtr(self, mutex); GetMutexPtr(self, mutex);
while (mutex->th != th) { while (mutex->th != th) {
int interrupted;
BLOCKING_REGION({ BLOCKING_REGION({
lock_func(th, mutex); interrupted = lock_func(th, mutex);
}, lock_interrupt, mutex); }, lock_interrupt, mutex);
RUBY_VM_CHECK_INTS(); if (interrupted) {
RUBY_VM_CHECK_INTS();
}
} }
} }
return self; return self;

View file

@ -1,7 +1,7 @@
#define RUBY_VERSION "1.9.0" #define RUBY_VERSION "1.9.0"
#define RUBY_RELEASE_DATE "2008-04-12" #define RUBY_RELEASE_DATE "2008-04-13"
#define RUBY_VERSION_CODE 190 #define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20080412 #define RUBY_RELEASE_CODE 20080413
#define RUBY_PATCHLEVEL 0 #define RUBY_PATCHLEVEL 0
#define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MAJOR 1
@ -9,7 +9,7 @@
#define RUBY_VERSION_TEENY 0 #define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_YEAR 2008
#define RUBY_RELEASE_MONTH 4 #define RUBY_RELEASE_MONTH 4
#define RUBY_RELEASE_DAY 12 #define RUBY_RELEASE_DAY 13
#ifdef RUBY_EXTERN #ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_version[];