Exemple #1
0
static void
rb_signal_exec(int sig)
{
/*     rb_vm_thread_t *t; */
/*     VALUE exc; */
    VALUE cmd = rb_get_trap_cmd(sig);

    if (cmd == 0) {
	switch (sig) {
	  case SIGINT:
	    rb_interrupt();
	    break;
	  case SIGHUP:
	  case SIGQUIT:
	  case SIGTERM:
	  case SIGALRM:
	  case SIGUSR1:
	  case SIGUSR2:
/* 	    t = GetThreadPtr(rb_vm_main_thread()); */
/* 	    exc = rb_exc_new2(rb_eSignal, ruby_signal_name(sig)); */
/* 	    rb_vm_thread_raise(t, exc); */
/* 	    rb_raise(rb_eSignal, "%s", signo2signm(sig)); */
	    break;
	}
    }
    else if (cmd == Qundef) {
	//rb_thread_signal_exit(th);
    }
    else {
	signal_exec(cmd, rb_vm_trap_level_for_signal(sig), sig);
    }
}
Exemple #2
0
void
rb_trap_exit(void)
{
    rb_vm_t *vm = GET_VM();
    VALUE trap_exit = vm->trap_list[0].cmd;

    if (trap_exit) {
	vm->trap_list[0].cmd = 0;
	signal_exec(trap_exit, vm->trap_list[0].safe, 0);
    }
}
Exemple #3
0
void
rb_trap_exit(void)
{
#ifndef MACOS_UNUSE_SIGNAL
    if (trap_list[0].cmd) {
	VALUE trap_exit = trap_list[0].cmd;

	trap_list[0].cmd = 0;
	signal_exec(trap_exit, 0);
    }
#endif
}
void tp_exec(threadpool_t pool, LIST *list)
{
	struct threadpool *tp = (struct threadpool *) pool;

	enter_critical_section(tp);
	tp->list = list->first;
	/* tp->wait_count = list->size; */
	tp->wait_count = tp->thread_count;
	signal_exec(tp);
	exec_loop(tp, 0);
	if (tp->wait_count)
		wait_for_completion(tp);
	leave_critical_section(tp);
}
Exemple #5
0
void
rb_trap_exit(void)
{
#if 0//ndef MACOS_UNUSE_SIGNAL
    VALUE trap_exit;
    int safe;

    trap_exit = rb_vm_trap_cmd_for_signal(0);
    if (trap_exit != (VALUE)NULL) {
	safe = rb_vm_trap_level_for_signal(0);
	rb_vm_set_trap_for_signal((VALUE)0, safe, 0);
	signal_exec(trap_exit, safe, 0);
    }
#endif
}
void tp_release(threadpool_t pool)
{
	struct threadpool *tp = (struct threadpool *) pool;

	enter_critical_section(tp);
	tp->thread_die = ~0;
	tp->list = NULL;
	tp->wait_count = tp->thread_count;
	signal_exec(tp);
	if (tp->wait_count)
		wait_for_completion(tp);
	leave_critical_section(tp);

	sync_done(tp);
	free(tp);
}
Exemple #7
0
void
rb_signal_exec(rb_thread_t *th, int sig)
{
    rb_vm_t *vm = GET_VM();
    VALUE cmd = vm->trap_list[sig].cmd;
    int safe = vm->trap_list[sig].safe;

    if (cmd == 0) {
	switch (sig) {
	  case SIGINT:
	    rb_interrupt();
	    break;
#ifdef SIGHUP
	  case SIGHUP:
#endif
#ifdef SIGQUIT
	  case SIGQUIT:
#endif
#ifdef SIGTERM
	  case SIGTERM:
#endif
#ifdef SIGALRM
	  case SIGALRM:
#endif
#ifdef SIGUSR1
	  case SIGUSR1:
#endif
#ifdef SIGUSR2
	  case SIGUSR2:
#endif
	    rb_threadptr_signal_raise(th, sig);
	    break;
	}
    }
    else if (cmd == Qundef) {
	rb_threadptr_signal_exit(th);
    }
    else {
	signal_exec(cmd, safe, sig);
    }
}
Exemple #8
0
void
rb_signal_exec(rb_thread_t *th, int sig)
{
    VALUE cmd = rb_get_trap_cmd(sig);

    if (cmd == 0) {
	switch (sig) {
	  case SIGINT:
	    rb_interrupt();
	    break;
#ifdef SIGHUP
	  case SIGHUP:
#endif
#ifdef SIGQUIT
	  case SIGQUIT:
#endif
#ifdef SIGTERM
	  case SIGTERM:
#endif
#ifdef SIGALRM
	  case SIGALRM:
#endif
#ifdef SIGUSR1
	  case SIGUSR1:
#endif
#ifdef SIGUSR2
	  case SIGUSR2:
#endif
	    rb_thread_signal_raise(th, sig);
	    break;
	}
    }
    else if (cmd == Qundef) {
	rb_thread_signal_exit(th);
    }
    else {
	signal_exec(cmd, sig);
    }
}