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

ruby-changes:32970

From: nagachika <ko1@a...>
Date: Thu, 20 Feb 2014 01:28:12 +0900 (JST)
Subject: [ruby-changes:32970] nagachika:r45049 (ruby_2_0_0): merge revision(s) r43148, r43149, r43152: [Backport #8433]

nagachika	2014-02-20 01:28:06 +0900 (Thu, 20 Feb 2014)

  New Revision: 45049

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=45049

  Log:
    merge revision(s) r43148,r43149,r43152: [Backport #8433]
    
    * thread.c (terminate_atfork_i): fix locking mutexes not unlocked in
      forks when not tracked in thread.  [ruby-core:55102] [Bug #8433]

  Modified directories:
    branches/ruby_2_0_0/
  Modified files:
    branches/ruby_2_0_0/ChangeLog
    branches/ruby_2_0_0/test/ruby/test_thread.rb
    branches/ruby_2_0_0/thread.c
    branches/ruby_2_0_0/version.h
Index: ruby_2_0_0/ChangeLog
===================================================================
--- ruby_2_0_0/ChangeLog	(revision 45048)
+++ ruby_2_0_0/ChangeLog	(revision 45049)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/ChangeLog#L1
+Thu Feb 20 01:23:36 2014  Aaron Pfeifer  <aaron.pfeifer@g...>
+
+	* thread.c (terminate_atfork_i): fix locking mutexes not unlocked in
+	  forks when not tracked in thread.  [ruby-core:55102] [Bug #8433]
+
 Tue Feb 18 23:48:03 2014  Nobuyoshi Nakada  <nobu@r...>
 
 	* test/ruby/envutil.rb (assert_separately): require envutil in the
Index: ruby_2_0_0/thread.c
===================================================================
--- ruby_2_0_0/thread.c	(revision 45048)
+++ ruby_2_0_0/thread.c	(revision 45049)
@@ -384,6 +384,8 @@ typedef struct rb_mutex_struct https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/thread.c#L384
 } rb_mutex_t;
 
 static void rb_mutex_abandon_all(rb_mutex_t *mutexes);
+static void rb_mutex_abandon_keeping_mutexes(rb_thread_t *th);
+static void rb_mutex_abandon_locking_mutex(rb_thread_t *th);
 static const char* rb_mutex_unlock_th(rb_mutex_t *mutex, rb_thread_t volatile *th);
 
 void
@@ -3832,10 +3834,8 @@ terminate_atfork_i(st_data_t key, st_dat https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/thread.c#L3834
     GetThreadPtr(thval, th);
 
     if (th != (rb_thread_t *)current_th) {
-	if (th->keeping_mutexes) {
-	    rb_mutex_abandon_all(th->keeping_mutexes);
-	}
-	th->keeping_mutexes = NULL;
+	rb_mutex_abandon_keeping_mutexes(th);
+	rb_mutex_abandon_locking_mutex(th);
 	thread_cleanup_func(th, TRUE);
     }
     return ST_CONTINUE;
@@ -4099,8 +4099,6 @@ thgroup_add(VALUE group, VALUE thread) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/thread.c#L4099
 #define GetMutexPtr(obj, tobj) \
     TypedData_Get_Struct((obj), rb_mutex_t, &mutex_data_type, (tobj))
 
-static const char *rb_mutex_unlock_th(rb_mutex_t *mutex, rb_thread_t volatile *th);
-
 #define mutex_mark NULL
 
 static void
@@ -4432,6 +4430,28 @@ rb_mutex_unlock(VALUE self) https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/thread.c#L4430
 }
 
 static void
+rb_mutex_abandon_keeping_mutexes(rb_thread_t *th)
+{
+    if (th->keeping_mutexes) {
+	rb_mutex_abandon_all(th->keeping_mutexes);
+    }
+    th->keeping_mutexes = NULL;
+}
+
+static void
+rb_mutex_abandon_locking_mutex(rb_thread_t *th)
+{
+    rb_mutex_t *mutex;
+
+    if (!th->locking_mutex) return;
+
+    GetMutexPtr(th->locking_mutex, mutex);
+    if (mutex->th == th)
+	rb_mutex_abandon_all(mutex);
+    th->locking_mutex = Qfalse;
+}
+
+static void
 rb_mutex_abandon_all(rb_mutex_t *mutexes)
 {
     rb_mutex_t *mutex;
Index: ruby_2_0_0/version.h
===================================================================
--- ruby_2_0_0/version.h	(revision 45048)
+++ ruby_2_0_0/version.h	(revision 45049)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/version.h#L1
 #define RUBY_VERSION "2.0.0"
 #define RUBY_RELEASE_DATE "2014-02-20"
-#define RUBY_PATCHLEVEL 437
+#define RUBY_PATCHLEVEL 438
 
 #define RUBY_RELEASE_YEAR 2014
 #define RUBY_RELEASE_MONTH 2
Index: ruby_2_0_0/test/ruby/test_thread.rb
===================================================================
--- ruby_2_0_0/test/ruby/test_thread.rb	(revision 45048)
+++ ruby_2_0_0/test/ruby/test_thread.rb	(revision 45049)
@@ -937,4 +937,31 @@ Thread.new(Thread.current) {|mth| https://github.com/ruby/ruby/blob/trunk/ruby_2_0_0/test/ruby/test_thread.rb#L937
     size_large = invoke_rec script, vm_stack_size, 1024 * 1024 * 10
     assert_operator(size_default, :<=, size_large, "large size")
   end
+
+  def test_blocking_mutex_unlocked_on_fork
+    bug8433 = '[ruby-core:55102] [Bug #8433]'
+
+    mutex = Mutex.new
+    flag = false
+    mutex.lock
+
+    th = Thread.new do
+      mutex.synchronize do
+        flag = true
+        sleep
+      end
+    end
+
+    Thread.pass until th.stop?
+    mutex.unlock
+
+    pid = Process.fork do
+      exit(mutex.locked?)
+    end
+
+    th.kill
+
+    pid, status = Process.waitpid2(pid)
+    assert_equal(false, status.success?, bug8433)
+  end if Process.respond_to?(:fork)
 end

Property changes on: ruby_2_0_0
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r43148-43149,43152


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

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