[macruby-changes] [1935] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Fri Jun 26 11:52:51 PDT 2009


Revision: 1935
          http://trac.macosforge.org/projects/ruby/changeset/1935
Author:   lsansonetti at apple.com
Date:     2009-06-26 11:52:49 -0700 (Fri, 26 Jun 2009)
Log Message:
-----------
more MT work

Modified Paths:
--------------
    MacRuby/branches/experimental/thread.c
    MacRuby/branches/experimental/vm.cpp
    MacRuby/branches/experimental/vm.h

Modified: MacRuby/branches/experimental/thread.c
===================================================================
--- MacRuby/branches/experimental/thread.c	2009-06-26 13:52:20 UTC (rev 1934)
+++ MacRuby/branches/experimental/thread.c	2009-06-26 18:52:49 UTC (rev 1935)
@@ -546,7 +546,7 @@
 	    return "sleep";
 
 	case THREAD_KILLED:
-	    return "abort";
+	    return "aborting";
 
 	case THREAD_DEAD:
 	    return "dead";
@@ -576,7 +576,7 @@
 rb_thread_alive_p(VALUE thread, SEL sel)
 {
     rb_vm_thread_status_t s = GetThreadPtr(thread)->status;
-    return s == THREAD_ALIVE || s == THREAD_SLEEP ? Qtrue : Qfalse;
+    return s != THREAD_DEAD ? Qtrue : Qfalse;
 }
 
 /*

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-06-26 13:52:20 UTC (rev 1934)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-26 18:52:49 UTC (rev 1935)
@@ -242,6 +242,69 @@
     parse_in_eval = false;
 }
 
+static inline NODE *
+block_cache_key(NODE *node)
+{
+    if (nd_type(node) == NODE_IFUNC) {
+	// In this case, node is dynamic but fortunately u1.node is always
+	// unique (it contains the IMP)
+	return node->u1.node;
+    }
+    return node;
+}
+
+RoxorVM::RoxorVM(const RoxorVM &vm)
+{
+    current_top_object = vm.current_top_object;
+    current_class = vm.current_class;
+    safe_level = vm.safe_level;
+
+    std::vector<rb_vm_block_t *> &vm_blocks =
+	const_cast<RoxorVM &>(vm).current_blocks;
+    for (std::vector<rb_vm_block_t *>::iterator i = vm_blocks.begin();
+	 (i + 1) != vm_blocks.end();
+	 ++i) {
+
+	const rb_vm_block_t *orig = *i;
+	rb_vm_block_t *b = NULL;
+	if (orig != NULL) {
+#if 1
+	    b = const_cast<rb_vm_block_t *>(orig);
+#else
+	    // XXX: This code does not work yet, it raises a failed integrity
+	    // check when running the specs.
+	    const size_t block_size = sizeof(rb_vm_block_t *)
+		+ (orig->dvars_size * sizeof(VALUE *));
+
+	    b = (rb_vm_block_t *)xmalloc(block_size);
+	    memcpy(b, orig, block_size);
+
+	    GC_WB(&b->self, orig->self);
+	    GC_WB(&b->node, orig->node);
+	    GC_WB(&b->locals, orig->locals);
+	    GC_WB(&b->parent_block, orig->parent_block);  // XXX not sure
+#endif
+	    rb_objc_retain(b);
+	    NODE *key = block_cache_key(orig->node);
+	    blocks[key] = b;
+	}
+	current_blocks.push_back(b);
+    }
+
+    // TODO bindings, exceptions?
+
+    backref = Qnil;
+    broken_with = Qundef;
+    last_status = Qnil;
+    errinfo = Qnil;
+    parse_in_eval = false;
+}
+
+RoxorVM::~RoxorVM(void)
+{
+    // TODO
+}
+
 static void
 append_ptr_address(std::string &s, void *ptr)
 {
@@ -258,10 +321,9 @@
 	s.append("empty");
     }
     else {
-	for (std::vector<rb_vm_block_t *>::iterator i =
-		current_blocks.begin();
-		i != current_blocks.end();
-		++i) {
+	for (std::vector<rb_vm_block_t *>::iterator i = current_blocks.begin();
+	     i != current_blocks.end();
+	     ++i) {
 	    append_ptr_address(s, *i);
 	    s.append(" ");
 	}
@@ -2825,7 +2887,7 @@
 {
     assert(src_b->flags & VM_BLOCK_ACTIVE);
 
-    int block_size = sizeof(rb_vm_block_t)
+    const size_t block_size = sizeof(rb_vm_block_t)
 	    + (sizeof(VALUE *) * src_b->dvars_size);
 
     rb_vm_block_t *new_b = (rb_vm_block_t *)xmalloc(block_size);
@@ -2880,19 +2942,10 @@
 extern "C"
 rb_vm_block_t *
 rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self,
-		    rb_vm_var_uses **parent_var_uses,
-		    rb_vm_block_t *parent_block,
-		    int dvars_size, ...)
+	rb_vm_var_uses **parent_var_uses, rb_vm_block_t *parent_block,
+	int dvars_size, ...)
 {
-    NODE *cache_key;
-    if (nd_type(node) == NODE_IFUNC) {
-	// In this case, node is dynamic but fortunately u1.node is always
-	// unique (it contains the IMP)
-	cache_key = node->u1.node;
-    }
-    else {
-	cache_key = node;
-    }
+    NODE *cache_key = block_cache_key(node);
 
     bool cached = false;
     rb_vm_block_t *b = GET_VM()->uncache_or_create_block(cache_key, &cached,
@@ -4276,9 +4329,7 @@
 {
     GET_CORE()->set_multithreaded(true);
 
-    RoxorVM *vm = new RoxorVM();
-    vm->set_current_top_object(GET_VM()->get_current_top_object());
-    return (void *)vm;
+    return (void *)new RoxorVM(*GET_VM());
 }
 
 void
@@ -4352,9 +4403,6 @@
     rb_objc_gc_register_thread();
     GET_CORE()->register_thread(thread);
 
-    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
-
     // Release the thread now.
     rb_objc_release((void *)thread);
 
@@ -4482,6 +4530,7 @@
     }
 
     rb_vm_thread_t *t = GET_THREAD();
+
     pre_wait(t);
     const int code = pthread_cond_timedwait(&t->sleep_cond, &t->sleep_mutex,
 	    &ts);

Modified: MacRuby/branches/experimental/vm.h
===================================================================
--- MacRuby/branches/experimental/vm.h	2009-06-26 13:52:20 UTC (rev 1934)
+++ MacRuby/branches/experimental/vm.h	2009-06-26 18:52:49 UTC (rev 1935)
@@ -736,6 +736,8 @@
 
     public:
 	RoxorVM(void);
+	RoxorVM(const RoxorVM &vm);
+	~RoxorVM(void);
 
 	ACCESSOR(thread, VALUE);
 	ACCESSOR(current_class, Class);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090626/0a85e524/attachment.html>


More information about the macruby-changes mailing list