$OpenBSD: patch-rts_posix_Signals_c,v 1.2 2012/09/02 19:53:46 kili Exp $ There are several problems with the original code: - It doesn't work with uthreads (instead of running the default handler, the custom handler is called again, which causes an endless cascade of signals once the process gets a SIGTSTP). - It isn't posix compliant (sigprocmask(2) behaviour is unspecified for multithreaded processes, where you would have to use pthread_sigmask(3)). - It's far too complicated compared to the simple kill(getpid(), SIGSTOP). --- rts/posix/Signals.c.orig Wed Feb 1 19:10:32 2012 +++ rts/posix/Signals.c Sat Jun 9 21:36:25 2012 @@ -519,7 +519,7 @@ empty_handler (int sig STG_UNUSED) The trick we use is: - catch SIGTSTP - - in the handler, kill(getpid(),SIGTSTP) + - in the handler, kill(getpid(),SIGSTOP) - when this returns, restore the TTY settings This means we don't have to catch SIGCONT too. @@ -541,17 +541,8 @@ sigtstp_handler (int sig) } } - // de-install the SIGTSTP handler - set_sigtstp_action(rtsFalse); - // really stop the process now - { - sigset_t mask; - sigemptyset(&mask); - sigaddset(&mask, sig); - sigprocmask(SIG_UNBLOCK, &mask, NULL); - kill(getpid(), sig); - } + kill(getpid(), SIGSTOP); // on return, restore the TTY state for (fd = 0; fd <= 2; fd++) { @@ -559,8 +550,6 @@ sigtstp_handler (int sig) tcsetattr(0,TCSANOW,&ts[fd]); } } - - set_sigtstp_action(rtsTrue); } static void