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/