From 210367ec889f5910e270d6ea2c7ddb8a8d939e61 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 20 Jan 1999 04:59:39 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r372, which included commits to RCS files with non-trunk default branches. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@373 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- signal.c | 141 ++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 89 insertions(+), 52 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index e5621b4ec1..d7ce4921b2 100644 --- a/signal.c +++ b/signal.c @@ -9,16 +9,25 @@ ************************************************/ #include "ruby.h" -#include "sig.h" +#include "rubysig.h" #include #include +#ifdef __BEOS__ +#undef SIGBUS +#endif + #ifndef NSIG -#ifdef DJGPP -#define NSIG SIGMAX -#else -#define NSIG (_SIGMAX + 1) /* For QNX */ +# ifdef DJGPP +# define NSIG SIGMAX +# else +# define NSIG (_SIGMAX + 1) /* For QNX */ +# endif #endif + +#ifdef USE_CWGUSI +# undef NSIG +# define NSIG __signal_max #endif static struct signals { @@ -171,31 +180,33 @@ signm2signo(nm) } VALUE -f_kill(argc, argv) +rb_f_kill(argc, argv) int argc; VALUE *argv; { +#ifdef USE_CWGUSI + rb_notimplement(); +#else + int negative = 0; int sig; int i; char *s; rb_secure(2); if (argc < 2) - ArgError("wrong # of arguments -- kill(sig, pid...)"); + rb_raise(rb_eArgError, "wrong # of arguments -- kill(sig, pid...)"); switch (TYPE(argv[0])) { case T_FIXNUM: sig = FIX2UINT(argv[0]); if (sig >= NSIG) { s = rb_id2name(sig); - if (!s) ArgError("Bad signal"); + if (!s) rb_raise(rb_eArgError, "Bad signal"); goto str_signal; } break; case T_STRING: - { - int negative = 0; - + { s = RSTRING(argv[0])->ptr; if (s[0] == '-') { negative++; @@ -205,7 +216,7 @@ f_kill(argc, argv) if (strncmp("SIG", s, 3) == 0) s += 3; if((sig = signm2signo(s)) == 0) - ArgError("Unrecognized signal name `%s'", s); + rb_raise(rb_eArgError, "Unrecognized signal name `%s'", s); if (negative) sig = -sig; @@ -213,7 +224,8 @@ f_kill(argc, argv) break; default: - ArgError("bad signal type %s", rb_class2name(CLASS_OF(argv[0]))); + rb_raise(rb_eArgError, "bad signal type %s", + rb_class2name(CLASS_OF(argv[0]))); break; } @@ -237,23 +249,26 @@ f_kill(argc, argv) } } return INT2FIX(i-1); +#endif /* USE_CWGUSI */ } static VALUE trap_list[NSIG]; static int trap_pending_list[NSIG]; -int trap_pending; -int trap_immediate; -int prohibit_interrupt; +int rb_trap_pending; +int rb_trap_immediate; +int rb_prohibit_interrupt; void -gc_mark_trap_list() +rb_gc_mark_trap_list() { +#ifndef MACOS_UNUSE_SIGNAL int i; for (i=0; i= NSIG ||(sig != SIGINT && !trap_list[sig])) - Bug("trap_handler: Bad signal %d", sig); + rb_bug("trap_handler: Bad signal %d", sig); #if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL) signal(sig, sighandle); #endif - if (trap_immediate) { - trap_immediate = 0; + if (rb_trap_immediate) { + rb_trap_immediate = 0; if (sig == SIGINT && !trap_list[SIGINT]) { -#ifdef THREAD - thread_interrupt(); -#else rb_interrupt(); -#endif } rb_trap_eval(trap_list[sig], sig); - trap_immediate = 1; + rb_trap_immediate = 1; } else { - trap_pending++; + rb_trap_pending++; trap_pending_list[sig]++; } } @@ -305,7 +321,7 @@ static RETSIGTYPE sigbus(sig) int sig; { - Bug("Bus Error"); + rb_bug("Bus Error"); } #endif @@ -314,41 +330,42 @@ static RETSIGTYPE sigsegv(sig) int sig; { - Bug("Segmentation fault"); + rb_bug("Segmentation fault"); } #endif void rb_trap_exit() { - if (trap_list[0]) - rb_eval_cmd(trap_list[0], ary_new3(1, INT2FIX(0))); +#ifndef MACOS_UNUSE_SIGNAL + if (trap_list[0]) { + rb_eval_cmd(trap_list[0], rb_ary_new3(1, INT2FIX(0))); + } +#endif } void rb_trap_exec() { +#ifndef MACOS_UNUSE_SIGNAL int i; for (i=0; isig); } if (sig < 0 || sig > NSIG) { - ArgError("Invalid signal no %d", sig); + rb_raise(rb_eArgError, "Invalid signal no %d", sig); } -#if defined(THREAD) && defined(HAVE_SETITIMER) && !defined(__BOW__) +#if defined(USE_THREAD) && defined(HAVE_SETITIMER) && !defined(__BOW__) if (sig == SIGVTALRM) { - ArgError("SIGVTALRM reserved for Thread; cannot set handler"); + rb_raise(rb_eArgError, "SIGVTALRM reserved for Thread; cannot set handler"); } #endif if (func == SIG_DFL) { @@ -455,7 +478,7 @@ trap(arg) trap_list[sig] = command; /* enable at least specified signal. */ -#ifndef NT +#if !defined(NT) && !defined(USE_CWGUSI) #ifdef HAVE_SIGPROCMASK sigdelset(&arg->mask, sig); #else @@ -465,8 +488,8 @@ trap(arg) return old; } -#ifndef NT -static void +#if !defined(NT) && !defined(USE_CWGUSI) +static VALUE trap_ensure(arg) struct trap_arg *arg; { @@ -476,11 +499,25 @@ trap_ensure(arg) #else sigsetmask(arg->mask); #endif + trap_last_mask = arg->mask; + return 0; } #endif +void +rb_trap_restore_mask() +{ +#ifndef NT +# ifdef HAVE_SIGPROCMASK + sigprocmask(SIG_SETMASK, &trap_last_mask, NULL); +# else + sigsetmask(trap_last_mask); +# endif +#endif +} + static VALUE -f_trap(argc, argv) +rb_f_trap(argc, argv) int argc; VALUE *argv; { @@ -488,18 +525,18 @@ f_trap(argc, argv) rb_secure(2); if (argc == 0 || argc > 2) { - ArgError("wrong # of arguments -- trap(sig, cmd)/trap(sig){...}"); + rb_raise(rb_eArgError, "wrong # of arguments -- trap(sig, cmd)/trap(sig){...}"); } arg.sig = argv[0]; if (argc == 1) { - arg.cmd = f_lambda(); + arg.cmd = rb_f_lambda(); } else if (argc == 2) { arg.cmd = argv[1]; } -#ifndef NT +#if !defined(NT) && !defined(USE_CWGUSI) /* disable interrupt */ # ifdef HAVE_SIGPROCMASK sigfillset(&arg.mask); @@ -508,7 +545,7 @@ f_trap(argc, argv) arg.mask = sigblock(~0); # endif - return rb_ensure(trap, &arg, trap_ensure, &arg); + return rb_ensure(trap, (VALUE)&arg, trap_ensure, (VALUE)&arg); #else return trap(&arg); #endif @@ -517,9 +554,8 @@ f_trap(argc, argv) void Init_signal() { - extern VALUE mKernel; - - rb_define_global_function("trap", f_trap, -1); +#ifndef MACOS_UNUSE_SIGNAL + rb_define_global_function("trap", rb_f_trap, -1); #ifdef POSIX_SIGNAL posix_signal(SIGINT, sighandle); #else @@ -531,4 +567,5 @@ Init_signal() #ifdef SIGSEGV signal(SIGSEGV, sigsegv); #endif +#endif /* MACOS_UNUSE_SIGNAL */ } -- cgit v1.2.3