aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--thread.c11
2 files changed, 18 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 73ee9ff902..389c288a11 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Wed Jun 17 12:37:37 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * thread.c (ruby_thread_stack_overflow): call rb_exc_raise() on
+ stack overflows in the signal handler, if sigaltstack is
+ available. On stack overflow (and with sigaltstack), the signal
+ handler is more likely to have room to create an exception
+ object. [ruby-core:23813]
+
Wed Jun 17 08:10:38 2009 Koichi Sasada <ko1@atdot.net>
* ext/objspace: added. objspace library extends some methods to
diff --git a/thread.c b/thread.c
index efe5d02dd5..63706c9800 100644
--- a/thread.c
+++ b/thread.c
@@ -1300,12 +1300,21 @@ rb_threadptr_signal_exit(rb_thread_t *th)
rb_threadptr_raise(th->vm->main_thread, 2, argv);
}
+#if defined(POSIX_SIGNAL) && defined(SIGSEGV) && defined(HAVE_SIGALTSTACK)
+#define USE_SIGALTSTACK
+#endif
+
void
ruby_thread_stack_overflow(rb_thread_t *th)
{
- th->errinfo = sysstack_error;
th->raised_flag = 0;
+#ifdef USE_SIGALTSTACK
+ th->raised_flag = 0;
+ rb_exc_raise(sysstack_error);
+#else
+ th->errinfo = sysstack_error;
TH_JUMP_TAG(th, TAG_RAISE);
+#endif
}
int