summaryrefslogtreecommitdiff
path: root/signal.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-30 06:20:09 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-30 06:20:09 +0000
commit639bd5e78fa7d83b44c892afccb99869a886e533 (patch)
treed33ef363870dccb8536cbcc1ab3a8780df92ff7f /signal.c
parent00433666fd12d7e08c4c7c51593fc30265dd4508 (diff)
* eval.c (rb_eval): pre-evaluate argument for unambiguous
evaluation order. [ruby-dev:26383] * lib/delegate.rb (Delegator::method_missing): forward unknown method to the destination. suggested by <christophe.poucet@gmail.com>. [ruby-talk:146776] * process.c (detach_process_watcher): terminate process watcher thread right after rb_waitpid() succeed. [ruby-talk:146430] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'signal.c')
-rw-r--r--signal.c64
1 files changed, 38 insertions, 26 deletions
diff --git a/signal.c b/signal.c
index 3cb49cc0f5..0adc447313 100644
--- a/signal.c
+++ b/signal.c
@@ -593,6 +593,14 @@ sigexit(sig)
}
#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();
}
@@ -601,39 +609,43 @@ trap(arg)
struct trap_arg *arg;
{
sighandler_t func, oldfunc;
- VALUE command, oldcmd;
+ VALUE command, tmp, oldcmd;
int sig = -1;
char *s;
func = sighandler;
- command = arg->cmd;
- if (NIL_P(command)) {
+ if (NIL_P(arg->cmd)) {
func = SIG_IGN;
}
- else if (TYPE(command) == T_STRING) {
- SafeStringValue(command); /* taint check */
- if (RSTRING(command)->len == 0) {
- func = SIG_IGN;
- }
- else if (RSTRING(command)->len == 7) {
- if (strncmp(RSTRING(command)->ptr, "SIG_IGN", 7) == 0) {
- func = SIG_IGN;
- }
- else if (strncmp(RSTRING(command)->ptr, "SIG_DFL", 7) == 0) {
- func = SIG_DFL;
- }
- else if (strncmp(RSTRING(command)->ptr, "DEFAULT", 7) == 0) {
- func = SIG_DFL;
- }
- }
- else if (RSTRING(command)->len == 6) {
- if (strncmp(RSTRING(command)->ptr, "IGNORE", 6) == 0) {
+ else {
+ command = rb_check_string_type(arg->cmd);
+ if (!NIL_P(command)) {
+ SafeStringValue(command); /* taint check */
+ switch (RSTRING(command)->len) {
+ case 0:
func = SIG_IGN;
- }
- }
- else if (RSTRING(command)->len == 4) {
- if (strncmp(RSTRING(command)->ptr, "EXIT", 4) == 0) {
- func = sigexit;
+ break;
+ case 7:
+ if (strncmp(RSTRING(command)->ptr, "SIG_IGN", 7) == 0) {
+ func = SIG_IGN;
+ }
+ else if (strncmp(RSTRING(command)->ptr, "SIG_DFL", 7) == 0) {
+ func = SIG_DFL;
+ }
+ else if (strncmp(RSTRING(command)->ptr, "DEFAULT", 7) == 0) {
+ func = SIG_DFL;
+ }
+ break;
+ case 6:
+ if (strncmp(RSTRING(command)->ptr, "IGNORE", 6) == 0) {
+ func = SIG_IGN;
+ }
+ break;
+ case 4:
+ if (strncmp(RSTRING(command)->ptr, "EXIT", 4) == 0) {
+ func = sigexit;
+ }
+ break;
}
}
}