Exemple #1
0
void unix_init_signals(void)
{
	struct sigaction memory_sigaction;
	struct sigaction misc_sigaction;
	struct sigaction ignore_sigaction;

	memset(&memory_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&memory_sigaction.sa_mask);
	memory_sigaction.sa_sigaction = memory_signal_handler;
	memory_sigaction.sa_flags = SA_SIGINFO;

	sigaction_safe(SIGBUS,&memory_sigaction,NULL);
	sigaction_safe(SIGSEGV,&memory_sigaction,NULL);

	memset(&misc_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&misc_sigaction.sa_mask);
	misc_sigaction.sa_sigaction = misc_signal_handler;
	misc_sigaction.sa_flags = SA_SIGINFO;

	sigaction_safe(SIGABRT,&misc_sigaction,NULL);
	sigaction_safe(SIGFPE,&misc_sigaction,NULL);
	sigaction_safe(SIGQUIT,&misc_sigaction,NULL);
	sigaction_safe(SIGILL,&misc_sigaction,NULL);

	memset(&ignore_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&ignore_sigaction.sa_mask);
	ignore_sigaction.sa_handler = SIG_IGN;
	sigaction_safe(SIGPIPE,&ignore_sigaction,NULL);
}
Exemple #2
0
void factor_vm::unix_init_signals()
{
	/* OpenBSD doesn't support sigaltstack() if we link against
	libpthread. See http://redmine.ruby-lang.org/issues/show/1239 */

#ifndef __OpenBSD__
	signal_callstack_seg = new segment(callstack_size,false);

	stack_t signal_callstack;
	signal_callstack.ss_sp = (char *)signal_callstack_seg->start;
	signal_callstack.ss_size = signal_callstack_seg->size;
	signal_callstack.ss_flags = 0;

	if(sigaltstack(&signal_callstack,(stack_t *)NULL) < 0)
		fatal_error("sigaltstack() failed",0);
#endif

	struct sigaction memory_sigaction;
	struct sigaction misc_sigaction;
	struct sigaction fpe_sigaction;
	struct sigaction ignore_sigaction;

	memset(&memory_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&memory_sigaction.sa_mask);
	memory_sigaction.sa_sigaction = memory_signal_handler;
	memory_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK;

	sigaction_safe(SIGBUS,&memory_sigaction,NULL);
	sigaction_safe(SIGSEGV,&memory_sigaction,NULL);

	memset(&fpe_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&fpe_sigaction.sa_mask);
	fpe_sigaction.sa_sigaction = fpe_signal_handler;
	fpe_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK;

	sigaction_safe(SIGFPE,&fpe_sigaction,NULL);

	memset(&misc_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&misc_sigaction.sa_mask);
	misc_sigaction.sa_sigaction = misc_signal_handler;
	misc_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK;

	sigaction_safe(SIGQUIT,&misc_sigaction,NULL);
	sigaction_safe(SIGILL,&misc_sigaction,NULL);

	/* We don't use SA_IGN here because then the ignore action is inherited
	by subprocesses, which we don't want. There is a unit test in
	io.launcher.unix for this. */
	memset(&ignore_sigaction,0,sizeof(struct sigaction));
	sigemptyset(&ignore_sigaction.sa_mask);
	ignore_sigaction.sa_sigaction = ignore_signal_handler;
	ignore_sigaction.sa_flags = SA_SIGINFO | SA_ONSTACK;
	sigaction_safe(SIGPIPE,&ignore_sigaction,NULL);
}
Exemple #3
0
void factor_vm::handle_ctrl_c() {
  struct sigaction fep_sigaction;
  init_sigaction_with_handler(&fep_sigaction, fep_signal_handler);
  sigaction_safe(SIGINT, &fep_sigaction, NULL);
}
Exemple #4
0
void factor_vm::unix_init_signals() {
  init_signal_pipe(this);

  signal_callstack_seg = new segment(callstack_size, false);

  stack_t signal_callstack;
  signal_callstack.ss_sp = (char*)signal_callstack_seg->start;
  signal_callstack.ss_size = signal_callstack_seg->size;
  signal_callstack.ss_flags = 0;

  if (sigaltstack(&signal_callstack, (stack_t*)NULL) < 0)
    fatal_error("sigaltstack() failed", 0);

  {
    struct sigaction memory_sigaction;
    init_sigaction_with_handler(&memory_sigaction, memory_signal_handler);
    sigaction_safe(SIGBUS, &memory_sigaction, NULL);
    sigaction_safe(SIGSEGV, &memory_sigaction, NULL);
    sigaction_safe(SIGTRAP, &memory_sigaction, NULL);
  }

  {
    struct sigaction fpe_sigaction;
    init_sigaction_with_handler(&fpe_sigaction, fpe_signal_handler);
    sigaction_safe(SIGFPE, &fpe_sigaction, NULL);
  }

  {
    struct sigaction synchronous_sigaction;
    init_sigaction_with_handler(&synchronous_sigaction,
                                synchronous_signal_handler);
    sigaction_safe(SIGILL, &synchronous_sigaction, NULL);
    sigaction_safe(SIGABRT, &synchronous_sigaction, NULL);
  }

  {
    struct sigaction enqueue_sigaction;
    init_sigaction_with_handler(&enqueue_sigaction, enqueue_signal_handler);
    sigaction_safe(SIGWINCH, &enqueue_sigaction, NULL);
    sigaction_safe(SIGUSR1, &enqueue_sigaction, NULL);
    sigaction_safe(SIGCONT, &enqueue_sigaction, NULL);
    sigaction_safe(SIGURG, &enqueue_sigaction, NULL);
    sigaction_safe(SIGIO, &enqueue_sigaction, NULL);
    sigaction_safe(SIGPROF, &enqueue_sigaction, NULL);
    sigaction_safe(SIGVTALRM, &enqueue_sigaction, NULL);
#ifdef SIGINFO
    sigaction_safe(SIGINFO, &enqueue_sigaction, NULL);
#endif
  }

  handle_ctrl_c();

  {
    struct sigaction sample_sigaction;
    init_sigaction_with_handler(&sample_sigaction, sample_signal_handler);
    sigaction_safe(SIGALRM, &sample_sigaction, NULL);
  }

  /* We don't use SA_IGN here because then the ignore action is inherited
     by subprocesses, which we don't want. There is a unit test in
     io.launcher.unix for this. */
  {
    struct sigaction ignore_sigaction;
    init_sigaction_with_handler(&ignore_sigaction, ignore_signal_handler);
    sigaction_safe(SIGPIPE, &ignore_sigaction, NULL);
    /* We send SIGUSR2 to the stdin_loop thread to interrupt it on FEP */
    sigaction_safe(SIGUSR2, &ignore_sigaction, NULL);
  }
}