diff options
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 39 |
1 files changed, 8 insertions, 31 deletions
diff --git a/src/process.c b/src/process.c index a371dece250..c654369627d 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -1609,14 +1609,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 1609 | #if !defined (WINDOWSNT) && defined (FD_CLOEXEC) | 1609 | #if !defined (WINDOWSNT) && defined (FD_CLOEXEC) |
| 1610 | int wait_child_setup[2]; | 1610 | int wait_child_setup[2]; |
| 1611 | #endif | 1611 | #endif |
| 1612 | #ifdef SIGCHLD | ||
| 1612 | sigset_t blocked, procmask; | 1613 | sigset_t blocked, procmask; |
| 1613 | struct sigaction sigint_action; | ||
| 1614 | struct sigaction sigquit_action; | ||
| 1615 | struct sigaction sigpipe_action; | ||
| 1616 | #ifdef AIX | ||
| 1617 | struct sigaction sighup_action; | ||
| 1618 | #endif | 1614 | #endif |
| 1619 | /* Use volatile to protect variables from being clobbered by longjmp. */ | 1615 | /* Use volatile to protect variables from being clobbered by vfork. */ |
| 1620 | volatile int forkin, forkout; | 1616 | volatile int forkin, forkout; |
| 1621 | volatile int pty_flag = 0; | 1617 | volatile int pty_flag = 0; |
| 1622 | 1618 | ||
| @@ -1708,25 +1704,13 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 1708 | XPROCESS (process)->pty_flag = pty_flag; | 1704 | XPROCESS (process)->pty_flag = pty_flag; |
| 1709 | pset_status (XPROCESS (process), Qrun); | 1705 | pset_status (XPROCESS (process), Qrun); |
| 1710 | 1706 | ||
| 1707 | #ifdef SIGCHLD | ||
| 1711 | /* Delay interrupts until we have a chance to store | 1708 | /* Delay interrupts until we have a chance to store |
| 1712 | the new fork's pid in its process structure */ | 1709 | the new fork's pid in its process structure */ |
| 1713 | sigemptyset (&blocked); | 1710 | sigemptyset (&blocked); |
| 1714 | #ifdef SIGCHLD | ||
| 1715 | sigaddset (&blocked, SIGCHLD); | 1711 | sigaddset (&blocked, SIGCHLD); |
| 1716 | #endif | ||
| 1717 | #ifdef HAVE_WORKING_VFORK | ||
| 1718 | /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal', | ||
| 1719 | this sets the parent's signal handlers as well as the child's. | ||
| 1720 | So delay all interrupts whose handlers the child might munge, | ||
| 1721 | and record the current handlers so they can be restored later. */ | ||
| 1722 | sigaddset (&blocked, SIGINT ); sigaction (SIGINT , 0, &sigint_action ); | ||
| 1723 | sigaddset (&blocked, SIGQUIT); sigaction (SIGQUIT, 0, &sigquit_action); | ||
| 1724 | sigaddset (&blocked, SIGPIPE); sigaction (SIGPIPE, 0, &sigpipe_action); | ||
| 1725 | #ifdef AIX | ||
| 1726 | sigaddset (&blocked, SIGHUP ); sigaction (SIGHUP , 0, &sighup_action ); | ||
| 1727 | #endif | ||
| 1728 | #endif /* HAVE_WORKING_VFORK */ | ||
| 1729 | pthread_sigmask (SIG_BLOCK, &blocked, &procmask); | 1712 | pthread_sigmask (SIG_BLOCK, &blocked, &procmask); |
| 1713 | #endif | ||
| 1730 | 1714 | ||
| 1731 | FD_SET (inchannel, &input_wait_mask); | 1715 | FD_SET (inchannel, &input_wait_mask); |
| 1732 | FD_SET (inchannel, &non_keyboard_wait_mask); | 1716 | FD_SET (inchannel, &non_keyboard_wait_mask); |
| @@ -1879,8 +1863,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 1879 | in the child. */ | 1863 | in the child. */ |
| 1880 | signal (SIGPIPE, SIG_DFL); | 1864 | signal (SIGPIPE, SIG_DFL); |
| 1881 | 1865 | ||
| 1866 | #ifdef SIGCHLD | ||
| 1882 | /* Stop blocking signals in the child. */ | 1867 | /* Stop blocking signals in the child. */ |
| 1883 | pthread_sigmask (SIG_SETMASK, &procmask, 0); | 1868 | pthread_sigmask (SIG_SETMASK, &procmask, 0); |
| 1869 | #endif | ||
| 1884 | 1870 | ||
| 1885 | if (pty_flag) | 1871 | if (pty_flag) |
| 1886 | child_setup_tty (xforkout); | 1872 | child_setup_tty (xforkout); |
| @@ -1959,19 +1945,10 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) | |||
| 1959 | #endif | 1945 | #endif |
| 1960 | } | 1946 | } |
| 1961 | 1947 | ||
| 1962 | /* Restore the signal state whether vfork succeeded or not. | 1948 | #ifdef SIGCHLD |
| 1963 | (We will signal an error, below, if it failed.) */ | ||
| 1964 | #ifdef HAVE_WORKING_VFORK | ||
| 1965 | /* Restore the parent's signal handlers. */ | ||
| 1966 | sigaction (SIGINT, &sigint_action, 0); | ||
| 1967 | sigaction (SIGQUIT, &sigquit_action, 0); | ||
| 1968 | sigaction (SIGPIPE, &sigpipe_action, 0); | ||
| 1969 | #ifdef AIX | ||
| 1970 | sigaction (SIGHUP, &sighup_action, 0); | ||
| 1971 | #endif | ||
| 1972 | #endif /* HAVE_WORKING_VFORK */ | ||
| 1973 | /* Stop blocking signals in the parent. */ | 1949 | /* Stop blocking signals in the parent. */ |
| 1974 | pthread_sigmask (SIG_SETMASK, &procmask, 0); | 1950 | pthread_sigmask (SIG_SETMASK, &procmask, 0); |
| 1951 | #endif | ||
| 1975 | 1952 | ||
| 1976 | /* Now generate the error if vfork failed. */ | 1953 | /* Now generate the error if vfork failed. */ |
| 1977 | if (pid < 0) | 1954 | if (pid < 0) |