* thread_pthread.c (gvl_reinit): register atfork hander only in

the parent process, to get rid of dead lock.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29957 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-11-28 05:46:32 +00:00
parent 450463d5fb
commit 079545cd8c
2 changed files with 13 additions and 4 deletions

View File

@ -1,3 +1,8 @@
Sun Nov 28 14:46:24 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread_pthread.c (gvl_reinit): register atfork hander only in
the parent process, to get rid of dead lock.
Sun Nov 28 12:23:57 2010 Koichi Sasada <ko1@atdot.net> Sun Nov 28 12:23:57 2010 Koichi Sasada <ko1@atdot.net>
* thread.c, vm_core.h: make gvl_acquire/release/init/destruct * thread.c, vm_core.h: make gvl_acquire/release/init/destruct

View File

@ -132,22 +132,26 @@ gvl_atfork(rb_vm_t *vm)
#endif #endif
} }
static void gvl_init(rb_vm_t *vm); static void gvl_reinit(rb_vm_t *vm);
static void static void
gvl_atfork_child(void) gvl_atfork_child(void)
{ {
gvl_init(GET_VM()); gvl_reinit(GET_VM());
} }
static void static void
gvl_init(rb_vm_t *vm) gvl_init(rb_vm_t *vm)
{ {
int r;
if (GVL_DEBUG) fprintf(stderr, "gvl init\n"); if (GVL_DEBUG) fprintf(stderr, "gvl init\n");
native_mutex_initialize(&vm->gvl.lock);
native_atfork(0, 0, gvl_atfork_child); native_atfork(0, 0, gvl_atfork_child);
gvl_reinit(vm);
}
static void
gvl_reinit(rb_vm_t *vm)
{
native_mutex_initialize(&vm->gvl.lock);
vm->gvl.waiting_threads = 0; vm->gvl.waiting_threads = 0;
vm->gvl.waiting_last_thread = 0; vm->gvl.waiting_last_thread = 0;
vm->gvl.waiting = 0; vm->gvl.waiting = 0;