mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* signal.c (rb_disable_interrupt, rb_enable_interrupt): removed
USE_TRAP_MASK. * signal.c (trap_arg, trap_ensure): removed. * signal.c (trap, sig_trap): removed pointless signal disabling. We don't need it bacause we no longer run trap hander on signal hander context. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37725 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
6c56dae4b2
commit
75df3aae0f
2 changed files with 33 additions and 57 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Tue Nov 20 09:31:33 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
|
* signal.c (rb_disable_interrupt, rb_enable_interrupt): removed
|
||||||
|
USE_TRAP_MASK.
|
||||||
|
* signal.c (trap_arg, trap_ensure): removed.
|
||||||
|
* signal.c (trap, sig_trap): removed pointless signal disabling.
|
||||||
|
We don't need it bacause we no longer run trap hander on signal
|
||||||
|
hander context.
|
||||||
|
|
||||||
Tue Nov 20 09:20:49 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
Tue Nov 20 09:20:49 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
* prelude.rb: Moved Mutex#synchronize to
|
* prelude.rb: Moved Mutex#synchronize to
|
||||||
|
|
81
signal.c
81
signal.c
|
@ -36,12 +36,6 @@ ruby_atomic_exchange(rb_atomic_t *ptr, rb_atomic_t val)
|
||||||
#undef SIGBUS
|
#undef SIGBUS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_PTHREAD_SIGMASK
|
|
||||||
#define USE_TRAP_MASK 1
|
|
||||||
#else
|
|
||||||
#define USE_TRAP_MASK 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NSIG
|
#ifndef NSIG
|
||||||
# define NSIG (_SIGMAX + 1) /* For QNX */
|
# define NSIG (_SIGMAX + 1) /* For QNX */
|
||||||
#endif
|
#endif
|
||||||
|
@ -543,7 +537,7 @@ rb_signal_buff_size(void)
|
||||||
static void
|
static void
|
||||||
rb_disable_interrupt(void)
|
rb_disable_interrupt(void)
|
||||||
{
|
{
|
||||||
#if USE_TRAP_MASK
|
#ifdef HAVE_PTHREAD_SIGMASK
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
sigfillset(&mask);
|
sigfillset(&mask);
|
||||||
pthread_sigmask(SIG_SETMASK, &mask, NULL);
|
pthread_sigmask(SIG_SETMASK, &mask, NULL);
|
||||||
|
@ -553,7 +547,7 @@ rb_disable_interrupt(void)
|
||||||
static void
|
static void
|
||||||
rb_enable_interrupt(void)
|
rb_enable_interrupt(void)
|
||||||
{
|
{
|
||||||
#if USE_TRAP_MASK
|
#ifdef HAVE_PTHREAD_SIGMASK
|
||||||
sigset_t mask;
|
sigset_t mask;
|
||||||
sigemptyset(&mask);
|
sigemptyset(&mask);
|
||||||
pthread_sigmask(SIG_SETMASK, &mask, NULL);
|
pthread_sigmask(SIG_SETMASK, &mask, NULL);
|
||||||
|
@ -690,15 +684,6 @@ rb_signal_exec(rb_thread_t *th, int sig)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct trap_arg {
|
|
||||||
#if USE_TRAP_MASK
|
|
||||||
sigset_t mask;
|
|
||||||
#endif
|
|
||||||
int sig;
|
|
||||||
sighandler_t func;
|
|
||||||
VALUE cmd;
|
|
||||||
};
|
|
||||||
|
|
||||||
static sighandler_t
|
static sighandler_t
|
||||||
default_handler(int sig)
|
default_handler(int sig)
|
||||||
{
|
{
|
||||||
|
@ -849,13 +834,17 @@ trap_signm(VALUE vsig)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
trap(struct trap_arg *arg)
|
trap(int sig, sighandler_t func, VALUE command)
|
||||||
{
|
{
|
||||||
sighandler_t oldfunc, func = arg->func;
|
sighandler_t oldfunc;
|
||||||
VALUE oldcmd, command = arg->cmd;
|
VALUE oldcmd;
|
||||||
int sig = arg->sig;
|
|
||||||
rb_vm_t *vm = GET_VM();
|
rb_vm_t *vm = GET_VM();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Be careful. ruby_signal() and trap_list[sig].cmd must be changed
|
||||||
|
* atomically. In current implementation, we only need to don't call
|
||||||
|
* RUBY_VM_CHECK_INTS().
|
||||||
|
*/
|
||||||
oldfunc = ruby_signal(sig, func);
|
oldfunc = ruby_signal(sig, func);
|
||||||
oldcmd = vm->trap_list[sig].cmd;
|
oldcmd = vm->trap_list[sig].cmd;
|
||||||
switch (oldcmd) {
|
switch (oldcmd) {
|
||||||
|
@ -871,23 +860,10 @@ trap(struct trap_arg *arg)
|
||||||
|
|
||||||
vm->trap_list[sig].cmd = command;
|
vm->trap_list[sig].cmd = command;
|
||||||
vm->trap_list[sig].safe = rb_safe_level();
|
vm->trap_list[sig].safe = rb_safe_level();
|
||||||
/* enable at least specified signal. */
|
|
||||||
#if USE_TRAP_MASK
|
|
||||||
sigdelset(&arg->mask, sig);
|
|
||||||
#endif
|
|
||||||
return oldcmd;
|
return oldcmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_TRAP_MASK
|
|
||||||
static VALUE
|
|
||||||
trap_ensure(struct trap_arg *arg)
|
|
||||||
{
|
|
||||||
/* enable interrupt */
|
|
||||||
pthread_sigmask(SIG_SETMASK, &arg->mask, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
reserved_signal_p(int signo)
|
reserved_signal_p(int signo)
|
||||||
{
|
{
|
||||||
|
@ -952,45 +928,36 @@ reserved_signal_p(int signo)
|
||||||
static VALUE
|
static VALUE
|
||||||
sig_trap(int argc, VALUE *argv)
|
sig_trap(int argc, VALUE *argv)
|
||||||
{
|
{
|
||||||
struct trap_arg arg;
|
int sig;
|
||||||
|
sighandler_t func;
|
||||||
|
VALUE cmd;
|
||||||
|
|
||||||
rb_secure(2);
|
rb_secure(2);
|
||||||
rb_check_arity(argc, 1, 2);
|
rb_check_arity(argc, 1, 2);
|
||||||
|
|
||||||
arg.sig = trap_signm(argv[0]);
|
sig = trap_signm(argv[0]);
|
||||||
if (reserved_signal_p(arg.sig)) {
|
if (reserved_signal_p(sig)) {
|
||||||
const char *name = signo2signm(arg.sig);
|
const char *name = signo2signm(sig);
|
||||||
if (name)
|
if (name)
|
||||||
rb_raise(rb_eArgError, "can't trap reserved signal: SIG%s", name);
|
rb_raise(rb_eArgError, "can't trap reserved signal: SIG%s", name);
|
||||||
else
|
else
|
||||||
rb_raise(rb_eArgError, "can't trap reserved signal: %d", (int)arg.sig);
|
rb_raise(rb_eArgError, "can't trap reserved signal: %d", sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc == 1) {
|
if (argc == 1) {
|
||||||
arg.cmd = rb_block_proc();
|
cmd = rb_block_proc();
|
||||||
arg.func = sighandler;
|
func = sighandler;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
arg.cmd = argv[1];
|
cmd = argv[1];
|
||||||
arg.func = trap_handler(&arg.cmd, arg.sig);
|
func = trap_handler(&cmd, sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OBJ_TAINTED(arg.cmd)) {
|
if (OBJ_TAINTED(cmd)) {
|
||||||
rb_raise(rb_eSecurityError, "Insecure: tainted signal trap");
|
rb_raise(rb_eSecurityError, "Insecure: tainted signal trap");
|
||||||
}
|
}
|
||||||
#if USE_TRAP_MASK
|
|
||||||
{
|
|
||||||
sigset_t fullmask;
|
|
||||||
|
|
||||||
/* disable interrupt */
|
return trap(sig, func, cmd);
|
||||||
sigfillset(&fullmask);
|
|
||||||
pthread_sigmask(SIG_BLOCK, &fullmask, &arg.mask);
|
|
||||||
|
|
||||||
return rb_ensure(trap, (VALUE)&arg, trap_ensure, (VALUE)&arg);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
return trap(&arg);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue