Mercurial > hg > octave-lyh
diff src/sighandlers.cc @ 2626:b35a5cd8107f
[project @ 1997-01-27 01:41:30 by jwe]
author | jwe |
---|---|
date | Mon, 27 Jan 1997 01:43:16 +0000 |
parents | c454cd888ada |
children | f4d0604cbcc4 |
line wrap: on
line diff
--- a/src/sighandlers.cc +++ b/src/sighandlers.cc @@ -80,13 +80,33 @@ #endif #if defined (__EMX__) -#define MAYBE_UNBLOCK_SIGNAL(sig) \ +#define MAYBE_ACK_SIGNAL(sig) \ octave_set_signal_handler (sig, SIG_ACK) #else -#define MAYBE_UNBLOCK_SIGNAL(sig) \ +#define MAYBE_ACK_SIGNAL(sig) \ do { } while (0) #endif +// The following signal blocking stuff is stolen from bash: + +#define BLOCK_SIGNAL(sig, nvar, ovar) \ + do \ + { \ + sigemptyset (&nvar); \ + sigaddset (&nvar, sig); \ + sigemptyset (&ovar); \ + sigprocmask (SIG_BLOCK, &nvar, &ovar); \ + } \ + while (0) + +#if defined (HAVE_POSIX_SIGNALS) +#define BLOCK_CHILD(nvar, ovar) BLOCK_SIGNAL (SIGCHLD, nvar, ovar) +#define UNBLOCK_CHILD(ovar) sigprocmask (SIG_SETMASK, &ovar, 0) +#else +#define BLOCK_CHILD(nvar, ovar) ovar = sigblock (sigmask (SIGCHLD)) +#define UNBLOCK_CHILD(ovar) sigsetmask (ovar) +#endif + void octave_save_signal_mask (void) { @@ -189,14 +209,22 @@ static RETSIGTYPE sigchld_handler (int /* sig */) { -#if defined (__EMX__) volatile octave_interrupt_handler *saved_interrupt_handler = octave_ignore_interrupts (); + // I wonder if this is really right, or if SIGCHLD should just be + // blocked on OS/2 systems the same as for systems with POSIX signal + // functions. + +#if defined (__EMX__) volatile sig_handler *saved_sigchld_handler - = octave_set_signal_hanlder (SIGCHLD, SIG_IGN); + = octave_set_signal_handler (SIGCHLD, SIG_IGN); #endif + sigset_t set, oset; + + BLOCK_CHILD (set, oset); + int n = octave_child_list::length (); if (n == 0) @@ -230,13 +258,15 @@ } } -#if defined (__EMX__) octave_set_interrupt_handler (saved_interrupt_handler); + UNBLOCK_CHILD (oset); + +#ifdef __EMX__ octave_set_signal_handler (SIGCHLD, saved_sigchld_handler); #endif - MAYBE_UNBLOCK_SIGNAL (SIGCHLD); + MAYBE_ACK_SIGNAL (SIGCHLD); MAYBE_REINSTALL_SIGHANDLER (SIGCHLD, sigchld_handler); @@ -247,7 +277,7 @@ static RETSIGTYPE sigfpe_handler (int /* sig */) { - MAYBE_UNBLOCK_SIGNAL (SIGFPE); + MAYBE_ACK_SIGNAL (SIGFPE); MAYBE_REINSTALL_SIGHANDLER (SIGFPE, sigfpe_handler); @@ -272,7 +302,7 @@ static RETSIGTYPE sigint_handler (int sig) { - MAYBE_UNBLOCK_SIGNAL (sig); + MAYBE_ACK_SIGNAL (sig); MAYBE_REINSTALL_SIGHANDLER (sig, sigint_handler); @@ -288,7 +318,7 @@ static RETSIGTYPE sigpipe_handler (int /* sig */) { - MAYBE_UNBLOCK_SIGNAL (SIGPIPE); + MAYBE_ACK_SIGNAL (SIGPIPE); MAYBE_REINSTALL_SIGHANDLER (SIGPIPE, sigpipe_handler);