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

ruby-changes:14064

From: nobu <ko1@a...>
Date: Sat, 21 Nov 2009 01:02:05 +0900 (JST)
Subject: [ruby-changes:14064] Ruby:r25876 (mvm): * vm.c (rb_vm_s_parent, rb_vm_parent): new methods to return the

nobu	2009-11-21 01:00:11 +0900 (Sat, 21 Nov 2009)

  New Revision: 25876

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25876

  Log:
    * vm.c (rb_vm_s_parent, rb_vm_parent): new methods to return the
      parent VM.

  Modified files:
    branches/mvm/ChangeLog
    branches/mvm/vm.c
    branches/mvm/vm_core.h

Index: mvm/ChangeLog
===================================================================
--- mvm/ChangeLog	(revision 25875)
+++ mvm/ChangeLog	(revision 25876)
@@ -1,5 +1,8 @@
-Sat Nov 21 00:44:53 2009  Nobuyoshi Nakada  <nobu@r...>
+Sat Nov 21 01:00:09 2009  Nobuyoshi Nakada  <nobu@r...>
 
+	* vm.c (rb_vm_s_parent, rb_vm_parent): new methods to return the
+	  parent VM.
+
 	* file.c (Init_File): initialize key for separator only once.
 
 Fri Nov 20 08:15:45 2009  Nobuyoshi Nakada  <nobu@r...>
Index: mvm/vm_core.h
===================================================================
--- mvm/vm_core.h	(revision 25875)
+++ mvm/vm_core.h	(revision 25876)
@@ -277,6 +277,7 @@
 
 typedef struct rb_vm_struct {
     VALUE self;
+    VALUE parent;
 
     rb_thread_cond_t global_vm_waiting;
     rb_thread_lock_t global_vm_lock;
Index: mvm/vm.c
===================================================================
--- mvm/vm.c	(revision 25875)
+++ mvm/vm.c	(revision 25876)
@@ -1448,6 +1448,7 @@
 	if (vm->living_threads) {
 	    st_foreach(vm->living_threads, vm_mark_each_thread_func, 0);
 	}
+	RUBY_MARK_UNLESS_NULL(vm->parent);
 	RUBY_MARK_UNLESS_NULL(vm->thgroup_default);
 	RUBY_MARK_UNLESS_NULL(vm->mark_object_ary);
 	RUBY_MARK_UNLESS_NULL(vm->load_path);
@@ -2017,12 +2018,27 @@
 }
 
 static VALUE
-rb_vm_current(VALUE self)
+rb_vm_s_current(VALUE self)
 {
     return GET_VM()->self;
 }
 
 static VALUE
+rb_vm_s_parent(VALUE self)
+{
+    return GET_VM()->parent;
+}
+
+static VALUE
+rb_vm_parent(VALUE self)
+{
+    rb_vm_t *vm;
+
+    GetVMPtr(self, vm);
+    return vm->parent;
+}
+
+static VALUE
 rb_vm_to_s(VALUE self)
 {
     rb_vm_t *vm;
@@ -2038,7 +2054,8 @@
 
 struct vm_create_args {
     rb_vm_t *vm;
-    rb_thread_lock_t lock;
+    rb_vm_t *parent;
+    rb_thread_lock_t *lock;
     rb_thread_cond_t waiting;
     volatile int initialized;
 };
@@ -2050,18 +2067,20 @@
 {
     int ruby_executable_node(void *, int *);
     void *ruby_vm_parse_options(rb_vm_t *);
-    struct vm_create_args *args = (void *)arg;
+    struct vm_create_args *args = arg;
     rb_vm_t *vm = args->vm;
     int status;
 
     vm->ref_count++;
-    ruby_native_thread_lock(&args->lock);
     ruby_native_thread_unlock(&vm->global_vm_lock);
     status = ruby_vm_init(vm);
+    ruby_native_thread_lock(args->lock);
+    vm->parent = TypedData_Wrap_Struct(rb_cRubyVM, &vm_data_type, args->parent);
+    args->parent->ref_count++;
     if (!status) ruby_vmmgr_add(vm);
     args->initialized = 1;
     ruby_native_cond_signal(&args->waiting);
-    ruby_native_thread_unlock(&args->lock);
+    ruby_native_thread_unlock(args->lock);
 
     return (VALUE)ruby_vm_start(vm, status, 0);
 }
@@ -2082,20 +2101,18 @@
     th->first_args = (VALUE)&args;
 
     args.vm = vm;
+    args.parent = GET_VM();
     args.initialized = 0;
-    ruby_native_thread_lock_initialize(&args.lock);
+    args.lock = &GET_VM()->global_vm_lock;
     ruby_native_cond_initialize(&args.waiting);
-    ruby_native_thread_lock(&args.lock);
 
     ruby_native_thread_create(th);
     ruby_native_thread_unlock(&vm->global_vm_lock);
 
     while (!args.initialized) {
-	ruby_native_cond_wait(&args.waiting, &args.lock);
+	ruby_native_cond_wait(&args.waiting, args.lock);
     }
-    ruby_native_thread_unlock(&args.lock);
     ruby_native_cond_destroy(&args.waiting);
-    ruby_native_thread_lock_destroy(&args.lock);
     return self;
 }
 
@@ -2179,7 +2196,9 @@
     rb_define_method(rb_cRubyVM, "send", rb_vm_send, 1);
     rb_define_method(rb_cRubyVM, "recv", rb_vm_recv_m, -1);
     rb_define_method(rb_cRubyVM, "join", rb_vm_join, 0);
-    rb_define_singleton_method(rb_cRubyVM, "current", rb_vm_current, 0);
+    rb_define_method(rb_cRubyVM, "parent", rb_vm_parent, 0);
+    rb_define_singleton_method(rb_cRubyVM, "current", rb_vm_s_current, 0);
+    rb_define_singleton_method(rb_cRubyVM, "parent", rb_vm_s_parent, 0);
 
     /* ::VM::FrozenCore */
     fcore = rb_class_new(rb_cBasicObject);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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