[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]