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/