ruby-changes:13957
From: nobu <ko1@a...>
Date: Sat, 14 Nov 2009 08:47:54 +0900 (JST)
Subject: [ruby-changes:13957] Ruby:r25763 (mvm): * mvm.c (rb_vm_alone, rb_vm_main_p): new functions.
nobu 2009-11-14 08:45:49 +0900 (Sat, 14 Nov 2009) New Revision: 25763 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25763 Log: * mvm.c (rb_vm_alone, rb_vm_main_p): new functions. * thread.c (thread_start_func_2): ignore signals on sub VMs. Modified files: branches/mvm/ChangeLog branches/mvm/include/ruby/vm.h branches/mvm/mvm.c branches/mvm/thread.c Index: mvm/include/ruby/vm.h =================================================================== --- mvm/include/ruby/vm.h (revision 25762) +++ mvm/include/ruby/vm.h (revision 25763) @@ -27,7 +27,9 @@ int ruby_vm_join(ruby_vm_t *vm); int ruby_vm_cleanup(ruby_vm_t *vm, int ex, int *signo); int ruby_vm_destruct(ruby_vm_t *vm); -void ruby_vm_die(ruby_vm_t *); +int ruby_vm_alone(void); +int ruby_vm_main_p(ruby_vm_t *vm); +void ruby_vm_die(ruby_vm_t *vm); /* initialize API */ ruby_vm_t *ruby_init(void); Index: mvm/ChangeLog =================================================================== --- mvm/ChangeLog (revision 25762) +++ mvm/ChangeLog (revision 25763) @@ -1,5 +1,9 @@ -Sat Nov 14 08:40:32 2009 Nobuyoshi Nakada <nobu@r...> +Sat Nov 14 08:45:47 2009 Nobuyoshi Nakada <nobu@r...> + * mvm.c (rb_vm_alone, rb_vm_main_p): new functions. + + * thread.c (thread_start_func_2): ignore signals on sub VMs. + * vm.c (rb_vm_mark, vm_memsize): ignore other VM. * vm.c (rb_vm_initialize): add last NULL. Index: mvm/thread.c =================================================================== --- mvm/thread.c (revision 25762) +++ mvm/thread.c (revision 25763) @@ -452,7 +452,7 @@ native_mutex_lock(&th->vm->global_vm_lock); { - thread_debug("thread start (get lock): %p\n", (void *)th); + thread_debug("thread start (get lock): %p %p\n", (void *)th, th->vm); rb_thread_set_current(th); TH_PUSH_TAG(th); @@ -539,7 +539,11 @@ thread_cleanup_func(th); if (th != main_th) rb_check_deadlock(th->vm); if (th->vm->main_thread == th) { - ruby_cleanup(state); + int signo = 0; + ruby_vm_cleanup(th->vm, state, &signo); + if (signo && !ruby_vm_alone()) signo = 0; + ruby_vm_destruct(th->vm); + if (signo) ruby_default_signal(signo); } native_mutex_unlock(&th->vm->global_vm_lock); @@ -4343,6 +4347,7 @@ { /* acquire global vm lock */ rb_thread_lock_t *lp = &GET_THREAD()->vm->global_vm_lock; + thread_debug("InitVM_Thread: %p", GET_THREAD()->vm); native_mutex_lock(lp); native_mutex_initialize(&GET_THREAD()->interrupt_lock); } Index: mvm/mvm.c =================================================================== --- mvm/mvm.c (revision 25762) +++ mvm/mvm.c (revision 25763) @@ -215,6 +215,23 @@ specific_key.last = (ruby_builtin_object_count + 8) & ~7; } +int +rb_vm_alone(void) +{ + int alone = 0; + MVM_CRITICAL(vm_manager.lock, { + struct vm_list_struct *entry = vm_manager.list; + if (entry && !entry->next) alone = 1; + }); + return alone; +} + +int +rb_vm_main_p(rb_vm_t *vm) +{ + return vm == vm_manager.main; +} + static void vmmgr_add(rb_vm_t *vm) { @@ -223,11 +240,11 @@ entry->vm = vm; - if (vm_manager.main == 0) { - vm_manager.main = vm; - } + MVM_CRITICAL(vm_manager.lock, { + if (vm_manager.main == 0) { + vm_manager.main = vm; + } - MVM_CRITICAL(vm_manager.lock, { entry->next = vm_manager.list; vm_manager.list = entry; }); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/