ruby-changes:13946
From: nobu <ko1@a...>
Date: Fri, 13 Nov 2009 19:56:34 +0900 (JST)
Subject: [ruby-changes:13946] Ruby:r25750 (mvm): * mvm.c (vm_join): does nothing when vm has died.
nobu 2009-11-13 19:56:18 +0900 (Fri, 13 Nov 2009) New Revision: 25750 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25750 Log: * mvm.c (vm_join): does nothing when vm has died. * vm.c (rb_vm_free): notify to waiting vm. * vm.c (vm_create): global_vm_lock is already locked. Modified files: branches/mvm/ChangeLog branches/mvm/mvm.c branches/mvm/vm.c Index: mvm/ChangeLog =================================================================== --- mvm/ChangeLog (revision 25749) +++ mvm/ChangeLog (revision 25750) @@ -1,3 +1,11 @@ +Fri Nov 13 19:56:16 2009 Nobuyoshi Nakada <nobu@r...> + + * mvm.c (vm_join): does nothing when vm has died. + + * vm.c (rb_vm_free): notify to waiting vm. + + * vm.c (vm_create): global_vm_lock is already locked. + Fri Nov 13 16:28:22 2009 Nobuyoshi Nakada <nobu@r...> * thread.c (ruby_native_thread_create): start new thread with Index: mvm/mvm.c =================================================================== --- mvm/mvm.c (revision 25749) +++ mvm/mvm.c (revision 25750) @@ -236,9 +236,10 @@ static void vmmgr_del(rb_vm_t *vm) { - struct vm_list_struct *entry = vm_manager.list, *prev = 0; + struct vm_list_struct *entry, *prev = 0; MVM_CRITICAL(vm_manager.lock, { + entry = vm_manager.list; while (entry && entry->vm != vm) { prev = entry; entry = entry->next; @@ -280,6 +281,11 @@ if (!living_threads) return 0; MVM_CRITICAL(vm_manager.lock, do { + struct vm_list_struct *entry = vm_manager.list; + while (entry && entry->vm != vm) { + entry = entry->next; + } + if (!entry) break; ruby_native_cond_wait(&vm->global_vm_waiting, &vm_manager.lock); } while (vm->living_threads)); return 0; Index: mvm/vm.c =================================================================== --- mvm/vm.c (revision 25749) +++ mvm/vm.c (revision 25750) @@ -1501,6 +1501,8 @@ } ruby_native_thread_unlock(&vm->global_vm_lock); ruby_native_thread_lock_destroy(&vm->global_vm_lock); + ruby_native_cond_signal(&vm->global_vm_waiting); + ruby_native_cond_destroy(&vm->global_vm_waiting); #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE if (objspace) { rb_objspace_free(objspace); @@ -1534,6 +1536,7 @@ MEMZERO(vm, rb_vm_t, 1); vm->argc = -1; ruby_native_thread_lock_initialize(&vm->global_vm_lock); + ruby_native_cond_initialize(&vm->global_vm_waiting); vm->objspace = rb_objspace_alloc(); vm->src_encoding_index = -1; vm->global_state_version = 1; @@ -1955,6 +1958,7 @@ static void vm_parse_opt(rb_vm_t *vm, VALUE opt) { + rb_notimplement(); } static VALUE @@ -1985,6 +1989,7 @@ argsval = rb_str_wrap((char *)args, len); RBASIC(argsval)->klass = 0; argp = (char *)(args + argc); + vm->argv = args; for (i = 0; i < argc; ++i) { long n = RSTRING_LEN(argv[i]); args[i] = argp; @@ -2002,9 +2007,11 @@ vm_create(void *arg) { rb_vm_t *vm = arg; - - ruby_native_thread_lock(&vm->global_vm_lock); - return (VALUE)ruby_vm_run(vm, 0); + int status; + ruby_native_thread_unlock(&vm->global_vm_lock); + status = ruby_vm_run(vm, 0); + ruby_native_cond_signal(&vm->global_vm_waiting); + return (VALUE)status; } static VALUE -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/