* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2e5ef26a4e
commit
a1d4164257
12
ChangeLog
12
ChangeLog
@ -1,3 +1,15 @@
|
|||||||
|
Sun Jan 24 05:18:34 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Sun Jan 24 00:31:39 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* lib/rdoc/parser/ruby.rb: fix typo.
|
* lib/rdoc/parser/ruby.rb: fix typo.
|
||||||
|
33
thread.c
33
thread.c
@ -251,6 +251,17 @@ rb_thread_debug(
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
static void
|
||||||
set_unblock_function(rb_thread_t *th, rb_unblock_function_t *func, void *arg,
|
set_unblock_function(rb_thread_t *th, rb_unblock_function_t *func, void *arg,
|
||||||
@ -360,6 +371,15 @@ rb_thread_terminate_all(void)
|
|||||||
rb_thread_stop_timer_thread();
|
rb_thread_stop_timer_thread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
thread_cleanup_func_before_exec(void *th_ptr)
|
thread_cleanup_func_before_exec(void *th_ptr)
|
||||||
{
|
{
|
||||||
@ -376,11 +396,6 @@ thread_cleanup_func(void *th_ptr)
|
|||||||
{
|
{
|
||||||
rb_thread_t *th = th_ptr;
|
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;
|
th->locking_mutex = Qfalse;
|
||||||
thread_cleanup_func_before_exec(th_ptr);
|
thread_cleanup_func_before_exec(th_ptr);
|
||||||
native_thread_destroy(th);
|
native_thread_destroy(th);
|
||||||
@ -500,12 +515,15 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start, VALUE *register_stack_s
|
|||||||
th->stack = 0;
|
th->stack = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
thread_cleanup_func(th);
|
thread_unlock_all_locking_mutexes(th);
|
||||||
if (th != main_th) rb_check_deadlock(th->vm);
|
if (th != main_th) rb_check_deadlock(th->vm);
|
||||||
if (th->vm->main_thread == th) {
|
if (th->vm->main_thread == th) {
|
||||||
ruby_cleanup(state);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2739,6 +2757,7 @@ void
|
|||||||
rb_thread_atfork(void)
|
rb_thread_atfork(void)
|
||||||
{
|
{
|
||||||
rb_thread_atfork_internal(terminate_atfork_i);
|
rb_thread_atfork_internal(terminate_atfork_i);
|
||||||
|
GET_THREAD()->join_list_head = 0;
|
||||||
rb_reset_random_seed();
|
rb_reset_random_seed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
vm.c
2
vm.c
@ -1498,6 +1498,8 @@ ruby_vm_destruct(void *ptr)
|
|||||||
st_free_table(vm->living_threads);
|
st_free_table(vm->living_threads);
|
||||||
vm->living_threads = 0;
|
vm->living_threads = 0;
|
||||||
}
|
}
|
||||||
|
rb_thread_lock_unlock(&vm->global_vm_lock);
|
||||||
|
rb_thread_lock_destroy(&vm->global_vm_lock);
|
||||||
ruby_xfree(vm);
|
ruby_xfree(vm);
|
||||||
ruby_current_vm = 0;
|
ruby_current_vm = 0;
|
||||||
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
|
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
|
||||||
|
@ -655,6 +655,9 @@ void rb_threadptr_signal_raise(rb_thread_t *th, int sig);
|
|||||||
void rb_threadptr_signal_exit(rb_thread_t *th);
|
void rb_threadptr_signal_exit(rb_thread_t *th);
|
||||||
void rb_threadptr_execute_interrupts(rb_thread_t *);
|
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 { \
|
#define RUBY_VM_CHECK_INTS_TH(th) do { \
|
||||||
if (UNLIKELY(th->interrupt_flag)) { \
|
if (UNLIKELY(th->interrupt_flag)) { \
|
||||||
rb_threadptr_execute_interrupts(th); \
|
rb_threadptr_execute_interrupts(th); \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user