summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-20 16:00:11 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-20 16:00:11 +0000
commitb78a907264263585b838ec1f8fc9014a9f18c04d (patch)
tree0128c3b6f3b6cb20089faea3fc907f8af5fc51f2
parent794c91840b4f6bafff6eb94e98e7e5e3f69fea14 (diff)
downloadruby-b78a907264263585b838ec1f8fc9014a9f18c04d.tar.gz
* vm.c (rb_vm_s_parent, rb_vm_parent): new methods to return the
parent VM. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/mvm@25876 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--vm.c41
-rw-r--r--vm_core.h1
3 files changed, 35 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index 5982bbc1e7..27efc8eeb3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Sat Nov 21 00:44:53 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Nov 21 01:00:09 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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.
diff --git a/vm.c b/vm.c
index 61bfd989e1..eaac9c2fba 100644
--- a/vm.c
+++ b/vm.c
@@ -1448,6 +1448,7 @@ rb_vm_mark(void *ptr)
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 @@ rb_vm_initialize(int argc, VALUE *argv, VALUE self)
}
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 @@ static rb_thread_t *vm_make_main_thread(rb_vm_t *vm);
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 @@ vm_create(void *arg)
{
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 @@ rb_vm_start(VALUE self)
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 @@ InitVM_VM(void)
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);
diff --git a/vm_core.h b/vm_core.h
index 84da595539..51e9a35f75 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -277,6 +277,7 @@ typedef struct rb_queue {
typedef struct rb_vm_struct {
VALUE self;
+ VALUE parent;
rb_thread_cond_t global_vm_waiting;
rb_thread_lock_t global_vm_lock;