[macruby-changes] [4493] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Thu Sep 2 19:37:30 PDT 2010
Revision: 4493
http://trac.macosforge.org/projects/ruby/changeset/4493
Author: lsansonetti at apple.com
Date: 2010-09-02 19:37:28 -0700 (Thu, 02 Sep 2010)
Log Message:
-----------
when a thread exists prematurely because of an exception, write a message on stderr once the thread object is being finalized only if #join was never called
Modified Paths:
--------------
MacRuby/trunk/thread.c
MacRuby/trunk/vm.cpp
MacRuby/trunk/vm.h
Modified: MacRuby/trunk/thread.c
===================================================================
--- MacRuby/trunk/thread.c 2010-09-03 01:59:54 UTC (rev 4492)
+++ MacRuby/trunk/thread.c 2010-09-03 02:37:28 UTC (rev 4493)
@@ -10,6 +10,7 @@
#include "ruby/macruby.h"
#include "ruby/node.h"
#include "vm.h"
+#include "objc.h"
VALUE rb_cThread;
VALUE rb_cThGroup;
@@ -47,6 +48,23 @@
return Data_Wrap_Struct(rb_cThread, NULL, NULL, t);
}
+static IMP
+thread_finalize_imp_super = NULL;
+
+static void
+thread_finalize_imp(void *rcv, SEL sel)
+{
+ rb_vm_thread_t *t = GetThreadPtr(rcv);
+ if (t->exception != Qnil && !t->joined_on_exception) {
+ fprintf(stderr, "*** Thread %p exited prematurely because of an uncaught exception:\n%s\n",
+ t->thread,
+ rb_str_cstr(rb_format_exception_message(t->exception)));
+ }
+ if (thread_finalize_imp_super != NULL) {
+ ((void(*)(void *, SEL))thread_finalize_imp_super)(rcv, sel);
+ }
+}
+
static VALUE
thread_initialize(VALUE thread, SEL sel, int argc, const VALUE *argv)
{
@@ -215,9 +233,9 @@
// If the thread was terminated because of an exception, we need to
// propagate it.
if (t->exception != Qnil) {
+ t->joined_on_exception = true;
rb_exc_raise(t->exception);
}
-
return self;
}
@@ -1568,6 +1586,9 @@
rb_cThread = rb_define_class("Thread", rb_cObject);
rb_objc_define_method(*(VALUE *)rb_cThread, "alloc", thread_s_alloc, 0);
+ thread_finalize_imp_super = rb_objc_install_method2((Class)rb_cThread,
+ "finalize", (IMP)thread_finalize_imp);
+
rb_objc_define_method(*(VALUE *)rb_cThread, "start", thread_start, -1);
rb_objc_define_method(*(VALUE *)rb_cThread, "fork", thread_start, -1);
rb_objc_define_method(*(VALUE *)rb_cThread, "main", rb_thread_s_main, 0);
Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp 2010-09-03 01:59:54 UTC (rev 4492)
+++ MacRuby/trunk/vm.cpp 2010-09-03 02:37:28 UTC (rev 4493)
@@ -4543,6 +4543,7 @@
t->status = THREAD_ALIVE;
t->in_cond_wait = false;
t->abort_on_exception = false;
+ t->joined_on_exception = false;
t->group = Qnil; // will be set right after
t->mutexes = Qnil;
Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h 2010-09-03 01:59:54 UTC (rev 4492)
+++ MacRuby/trunk/vm.h 2010-09-03 02:37:28 UTC (rev 4493)
@@ -150,6 +150,7 @@
rb_vm_thread_status_t status;
bool in_cond_wait;
bool abort_on_exception; // per-local state, global one is in RoxorCore
+ bool joined_on_exception;
VALUE locals; // a Hash object or Qnil
VALUE exception; // killed-by exception or Qnil
VALUE group; // always a ThreadGroup object
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100902/dfe985f7/attachment.html>
More information about the macruby-changes
mailing list