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

ruby-changes:14551

From: nobu <ko1@a...>
Date: Sun, 24 Jan 2010 05:20:31 +0900 (JST)
Subject: [ruby-changes:14551] Ruby:r26390 (trunk): * thread.c (thread_start_func_2): unlock all locking mutexes

nobu	2010-01-24 05:18:36 +0900 (Sun, 24 Jan 2010)

  New Revision: 26390

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

  Log:
    * thread.c (thread_start_func_2): unlock all locking mutexes
      before clean up.  [ruby-core:26877]
    
    * thread.c (rb_thread_atfork): no other threads to be joined.
    
    * vm_core.h (rb_thread_lock_unlock, rb_thread_lock_destroy):
      new functions.
    
    * vm.c (ruby_vm_destruct): unlock and destroy global VM lock.

  Modified files:
    trunk/ChangeLog
    trunk/thread.c
    trunk/vm.c
    trunk/vm_core.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26389)
+++ ChangeLog	(revision 26390)
@@ -1,3 +1,15 @@
+Sun Jan 24 05:18:34 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* thread.c (thread_start_func_2): unlock all locking mutexes
+	  before clean up.  [ruby-core:26877]
+
+	* thread.c (rb_thread_atfork): no other threads to be joined.
+
+	* vm_core.h (rb_thread_lock_unlock, rb_thread_lock_destroy):
+	  new functions.
+
+	* vm.c (ruby_vm_destruct): unlock and destroy global VM lock.
+
 Sun Jan 24 00:31:39 2010  NARUSE, Yui  <naruse@r...>
 
 	* lib/rdoc/parser/ruby.rb: fix typo.
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 26389)
+++ vm_core.h	(revision 26390)
@@ -655,6 +655,9 @@
 void rb_threadptr_signal_exit(rb_thread_t *th);
 void rb_threadptr_execute_interrupts(rb_thread_t *);
 
+void rb_thread_lock_unlock(rb_thread_lock_t *);
+void rb_thread_lock_destroy(rb_thread_lock_t *);
+
 #define RUBY_VM_CHECK_INTS_TH(th) do { \
   if (UNLIKELY(th->interrupt_flag)) { \
     rb_threadptr_execute_interrupts(th); \
Index: thread.c
===================================================================
--- thread.c	(revision 26389)
+++ thread.c	(revision 26390)
@@ -251,7 +251,18 @@
 }
 #endif
 
+void
+rb_thread_lock_unlock(rb_thread_lock_t *lock)
+{
+    native_mutex_unlock(lock);
+}
 
+void
+rb_thread_lock_destroy(rb_thread_lock_t *lock)
+{
+    native_mutex_destroy(lock);
+}
+
 static void
 set_unblock_function(rb_thread_t *th, rb_unblock_function_t *func, void *arg,
 		     struct rb_unblock_callback *old)
@@ -361,6 +372,15 @@
 }
 
 static void
+thread_unlock_all_locking_mutexes(rb_thread_t *th)
+{
+    if (th->keeping_mutexes) {
+	rb_mutex_unlock_all(th->keeping_mutexes, th);
+	th->keeping_mutexes = NULL;
+    }
+}
+
+static void
 thread_cleanup_func_before_exec(void *th_ptr)
 {
     rb_thread_t *th = th_ptr;
@@ -376,11 +396,6 @@
 {
     rb_thread_t *th = th_ptr;
 
-    /* unlock all locking mutexes */
-    if (th->keeping_mutexes) {
-	rb_mutex_unlock_all(th->keeping_mutexes, th);
-	th->keeping_mutexes = NULL;
-    }
     th->locking_mutex = Qfalse;
     thread_cleanup_func_before_exec(th_ptr);
     native_thread_destroy(th);
@@ -500,12 +515,15 @@
 	    th->stack = 0;
 	}
     }
-    thread_cleanup_func(th);
+    thread_unlock_all_locking_mutexes(th);
     if (th != main_th) rb_check_deadlock(th->vm);
     if (th->vm->main_thread == th) {
 	ruby_cleanup(state);
     }
-    native_mutex_unlock(&th->vm->global_vm_lock);
+    else {
+	thread_cleanup_func(th);
+	native_mutex_unlock(&th->vm->global_vm_lock);
+    }
 
     return 0;
 }
@@ -2739,6 +2757,7 @@
 rb_thread_atfork(void)
 {
     rb_thread_atfork_internal(terminate_atfork_i);
+    GET_THREAD()->join_list_head = 0;
     rb_reset_random_seed();
 }
 
Index: vm.c
===================================================================
--- vm.c	(revision 26389)
+++ vm.c	(revision 26390)
@@ -1498,6 +1498,8 @@
 	    st_free_table(vm->living_threads);
 	    vm->living_threads = 0;
 	}
+	rb_thread_lock_unlock(&vm->global_vm_lock);
+	rb_thread_lock_destroy(&vm->global_vm_lock);
 	ruby_xfree(vm);
 	ruby_current_vm = 0;
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE

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

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