[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