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

ruby-changes:4497

From: ko1@a...
Date: Sun, 13 Apr 2008 18:52:44 +0900 (JST)
Subject: [ruby-changes:4497] nobu - Ruby:r15990 (trunk): * thread_pthread.c (lock_func): should not check interrupts in

nobu	2008-04-13 18:52:29 +0900 (Sun, 13 Apr 2008)

  New Revision: 15990

  Modified files:
    trunk/ChangeLog
    trunk/thread.c
    trunk/version.h

  Log:
    * thread_pthread.c (lock_func): should not check interrupts in
      blocking region.  [ruby-dev:34378]


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=15990&r2=15989&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15990&r2=15989&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/thread.c?r1=15990&r2=15989&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15989)
+++ ChangeLog	(revision 15990)
@@ -1,3 +1,8 @@
+Sun Apr 13 18:52:27 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* 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@r...>
 
 	* eval.c (ruby_exec_node, ruby_run_node), ruby.c (process_options):
Index: thread.c
===================================================================
--- thread.c	(revision 15989)
+++ thread.c	(revision 15990)
@@ -2317,23 +2317,23 @@
     return locked;
 }
 
-static VALUE
+static int
 lock_func(rb_thread_t *th, mutex_t *mutex)
 {
+    int interrupted = Qfalse;
+
     native_mutex_lock(&mutex->lock);
-    while (mutex->th) {
+    while (mutex->th || (mutex->th = th, 0)) {
 	mutex->cond_waiting++;
 	native_cond_wait(&mutex->cond, &mutex->lock);
 
 	if (th->interrupt_flag) {
-	    native_mutex_unlock(&mutex->lock);
-	    RUBY_VM_CHECK_INTS();
-	    native_mutex_lock(&mutex->lock);
+	    interrupted = Qtrue;
+	    break;
 	}
     }
-    mutex->th = th;
     native_mutex_unlock(&mutex->lock);
-    return Qnil;
+    return interrupted;
 }
 
 static void
@@ -2364,11 +2364,15 @@
 	GetMutexPtr(self, mutex);
 
 	while (mutex->th != th) {
+	    int interrupted;
+
 	    BLOCKING_REGION({
-		lock_func(th, mutex);
+		interrupted = lock_func(th, mutex);
 	    }, lock_interrupt, mutex);
 
-	    RUBY_VM_CHECK_INTS();
+	    if (interrupted) {
+		RUBY_VM_CHECK_INTS();
+	    }
 	}
     }
     return self;
Index: version.h
===================================================================
--- version.h	(revision 15989)
+++ version.h	(revision 15990)
@@ -1,7 +1,7 @@
 #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_RELEASE_CODE 20080412
+#define RUBY_RELEASE_CODE 20080413
 #define RUBY_PATCHLEVEL 0
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 0
 #define RUBY_RELEASE_YEAR 2008
 #define RUBY_RELEASE_MONTH 4
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_DAY 13
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];

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

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