static int exec_tramp(void *sig_stack) { init_new_thread_stack(sig_stack, NULL); init_new_thread_signals(); os_stop_process(os_getpid()); return(0); }
int fork_tramp(void *stack) { local_irq_disable(); arch_init_thread(); init_new_thread_stack(stack, finish_fork_handler); os_usr1_process(os_getpid()); change_sig(SIGUSR1, 1); return(0); }
static int new_thread_proc(void *stack) { /* local_irq_disable is needed to block out signals until this thread is * properly scheduled. Otherwise, the tracing thread will get mighty * upset about any signals that arrive before that. * This has the complication that it sets the saved signal mask in * the sigcontext to block signals. This gets restored when this * thread (or a descendant, since they get a copy of this sigcontext) * returns to userspace. * So, this is compensated for elsewhere. * XXX There is still a small window until local_irq_disable() actually * finishes where signals are possible - shouldn't be a problem in * practice since SIGIO hasn't been forwarded here yet, and the * local_irq_disable should finish before a SIGVTALRM has time to be * delivered. */ local_irq_disable(); init_new_thread_stack(stack, new_thread_handler); os_usr1_process(os_getpid()); change_sig(SIGUSR1, 1); return(0); }
void new_thread_proc(void *stack, void (*handler)(int sig)) { init_new_thread_stack(stack, handler); os_usr1_process(os_getpid()); }