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

source_changes at macosforge.org source_changes at macosforge.org
Fri Jun 26 23:39:28 PDT 2009


Revision: 1946
          http://trac.macosforge.org/projects/ruby/changeset/1946
Author:   lsansonetti at apple.com
Date:     2009-06-26 23:39:27 -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-27 06:38:55 UTC (rev 1945)
+++ MacRuby/branches/experimental/thread.c	2009-06-27 06:39:27 UTC (rev 1946)
@@ -131,31 +131,35 @@
     rb_scan_args(argc, argv, "01", &timeout);
 
     rb_vm_thread_t *t = GetThreadPtr(self);
-    if (t->status == THREAD_DEAD) {
-	return self;
-    }
-
-    if (timeout == Qnil) {
-	// No timeout given: block until the thread finishes.
-	pthread_assert(pthread_join(t->thread, NULL));
-    }
-    else {
-	// Timeout given: sleep then check if the thread is dead.
-	// TODO do multiple sleeps instead of only one.
-	struct timeval tv = rb_time_interval(timeout);
-	struct timespec ts;
-	ts.tv_sec = tv.tv_sec;
-	ts.tv_nsec = tv.tv_usec * 1000;
-	while (ts.tv_nsec >= 1000000000) {
-	    ts.tv_sec += 1;
-	    ts.tv_nsec -= 1000000000;
+    if (t->status != THREAD_DEAD) {
+	if (timeout == Qnil) {
+	    // No timeout given: block until the thread finishes.
+	    pthread_assert(pthread_join(t->thread, NULL));
 	}
-	nanosleep(&ts, NULL);
-	if (t->status != THREAD_DEAD) {
-	    return Qnil;
+	else {
+	    // Timeout given: sleep then check if the thread is dead.
+	    // TODO do multiple sleeps instead of only one.
+	    struct timeval tv = rb_time_interval(timeout);
+	    struct timespec ts;
+	    ts.tv_sec = tv.tv_sec;
+	    ts.tv_nsec = tv.tv_usec * 1000;
+	    while (ts.tv_nsec >= 1000000000) {
+		ts.tv_sec += 1;
+		ts.tv_nsec -= 1000000000;
+	    }
+	    nanosleep(&ts, NULL);
+	    if (t->status != THREAD_DEAD) {
+		return Qnil;
+	    }
 	}
     }
 
+    // If the thread was terminated because of an exception, we need to
+    // propagate it.
+    if (t->exception != Qnil) {
+	rb_exc_raise(t->exception);
+    }
+
     return self;
 }
 
@@ -570,8 +574,7 @@
 {
     rb_vm_thread_t *t = GetThreadPtr(thread);
     if (t->status == THREAD_DEAD) {
-	// TODO should return Qnil in case the thread got an exception.
-	return Qfalse;
+	return t->exception == Qnil ? Qfalse : Qnil;
     }
     return rb_str_new2(rb_thread_status_cstr(thread));
 }

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-06-27 06:38:55 UTC (rev 1945)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-27 06:39:27 UTC (rev 1946)
@@ -4420,9 +4420,11 @@
 	GC_WB(&t->value, val);
     }
     catch (...) {
-	// TODO handle thread-level exceptions.
-	//printf("exception raised inside thread %p\n", pthread_self());
-	t->value = Qfalse;
+	VALUE exc = rb_vm_current_exception();
+	if (exc != Qnil) {
+	    GC_WB(&t->exception, exc);
+	}
+	t->value = Qnil;
     }
 
     pthread_cleanup_pop(0);
@@ -4495,6 +4497,7 @@
     t->vm  = vm;
     t->value = Qundef;
     t->locals = Qnil;
+    t->exception = Qnil;
     t->status = THREAD_ALIVE;
     t->in_cond_wait = false;
 

Modified: MacRuby/branches/experimental/vm.h
===================================================================
--- MacRuby/branches/experimental/vm.h	2009-06-27 06:38:55 UTC (rev 1945)
+++ MacRuby/branches/experimental/vm.h	2009-06-27 06:39:27 UTC (rev 1946)
@@ -103,6 +103,7 @@
     rb_vm_thread_status_t status;
     bool in_cond_wait;
     VALUE locals;  // a Hash object or Qnil
+    VALUE exception;  // killed-by-exception or Qnil 
 } rb_vm_thread_t;
 
 typedef struct rb_vm_outer {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090626/7803e08f/attachment.html>


More information about the macruby-changes mailing list