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

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/

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