summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-07-19 08:31:04 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-07-19 08:31:04 +0000
commit20316027872b9a3a70babc884f838f499f1e5746 (patch)
treeffade6e5d1945bcecdd7236487b5f94a59b501a6 /signal.c
parent1fb55b9d7704c4e3df0118fe33890b65538dd06a (diff)
* signal.c (trap): remove sigexit(); handle "EXIT" via sig_exec().
[ruby-dev:26440] * io.c (rb_io_inspect): replace sprintf() with "%s" format all over the place by snprintf() to avoid integer overflow. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8800 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c28
1 files changed, 4 insertions, 24 deletions
diff --git a/signal.c b/signal.c
index 9c168d1fce..dc71b36317 100644
--- a/signal.c
+++ b/signal.c
@@ -424,6 +424,9 @@ signal_exec(sig)
break;
}
}
+ else if (trap_list[sig].cmd == Qundef) {
+ rb_thread_signal_exit();
+ }
else {
rb_thread_trap_eval(trap_list[sig].cmd, sig, trap_list[sig].safe);
}
@@ -581,29 +584,6 @@ static sigset_t trap_last_mask;
static int trap_last_mask;
# endif
-static RETSIGTYPE sigexit _((int));
-static RETSIGTYPE
-sigexit(sig)
- int sig;
-{
-#if defined(HAVE_NATIVETHREAD) && defined(HAVE_NATIVETHREAD_KILL)
- if (!is_ruby_native_thread() && !rb_trap_accept_nativethreads[sig]) {
- sigsend_to_ruby_thread(sig);
- return;
- }
-#endif
-
- if (trap_list[sig].cmd == 0 && ATOMIC_TEST(rb_trap_immediate)) {
- IN_MAIN_CONTEXT(signal_exec, sig);
- ATOMIC_SET(rb_trap_immediate, 1);
- }
- else {
- ATOMIC_INC(rb_trap_pending);
- ATOMIC_INC(trap_pending_list[sig]);
- }
- rb_thread_signal_exit();
-}
-
static VALUE
trap(arg)
struct trap_arg *arg;
@@ -643,7 +623,7 @@ trap(arg)
break;
case 4:
if (strncmp(RSTRING(command)->ptr, "EXIT", 4) == 0) {
- func = sigexit;
+ arg->cmd = Qundef;
}
break;
}