+2012-09-17 Paul Eggert <eggert@cs.ucla.edu>
+
+ Remove no-longer-needed Solaris 2.4 vfork bug workaround.
+ The workaround was for improving performance on Solaris 2.4, but
+ is getting in the way now. Emacs will still work if someone is
+ still running Solaris 2.4 in a museum somewhere; Sun dropped
+ support for Solaris 2.4 in 2003.
+ * callproc.c (Fcall_process) [HAVE_WORKING_VFORK]:
+ * process.c (create_process) [HAVE_WORKING_VFORK]:
+ Omit now-unnecessary workaround for the Solaris 2.4 vfork bug,
+ since Emacs no longer uses vfork on that platform.
+
2012-09-17 Glenn Morris <rgm@gnu.org>
* emacs.c: Use COPYRIGHT.
register char **save_environ = environ;
register int fd1 = fd[1];
int fd_error = fd1;
-#ifdef HAVE_WORKING_VFORK
- sigset_t procmask;
- sigset_t blocked;
- struct sigaction sigpipe_action;
-#endif
if (fd_output >= 0)
fd1 = fd_output;
0, current_dir);
#else /* not WINDOWSNT */
-#ifdef HAVE_WORKING_VFORK
- /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal',
- this sets the parent's signal handlers as well as the child's.
- So delay all interrupts whose handlers the child might munge,
- and record the current handlers so they can be restored later. */
- sigemptyset (&blocked);
- sigaddset (&blocked, SIGPIPE);
- sigaction (SIGPIPE, 0, &sigpipe_action);
- pthread_sigmask (SIG_BLOCK, &blocked, &procmask);
-#endif
-
BLOCK_INPUT;
/* vfork, and prevent local vars from being clobbered by the vfork. */
/* GConf causes us to ignore SIGPIPE, make sure it is restored
in the child. */
signal (SIGPIPE, SIG_DFL);
-#ifdef HAVE_WORKING_VFORK
- pthread_sigmask (SIG_SETMASK, &procmask, 0);
-#endif
child_setup (filefd, fd1, fd_error, (char **) new_argv,
0, current_dir);
UNBLOCK_INPUT;
-#ifdef HAVE_WORKING_VFORK
- /* Restore the signal state. */
- sigaction (SIGPIPE, &sigpipe_action, 0);
- pthread_sigmask (SIG_SETMASK, &procmask, 0);
-#endif
-
#endif /* not WINDOWSNT */
/* The MSDOS case did this already. */
#if !defined (WINDOWSNT) && defined (FD_CLOEXEC)
int wait_child_setup[2];
#endif
+#ifdef SIGCHLD
sigset_t blocked, procmask;
- struct sigaction sigint_action;
- struct sigaction sigquit_action;
- struct sigaction sigpipe_action;
-#ifdef AIX
- struct sigaction sighup_action;
#endif
- /* Use volatile to protect variables from being clobbered by longjmp. */
+ /* Use volatile to protect variables from being clobbered by vfork. */
volatile int forkin, forkout;
volatile int pty_flag = 0;
XPROCESS (process)->pty_flag = pty_flag;
pset_status (XPROCESS (process), Qrun);
+#ifdef SIGCHLD
/* Delay interrupts until we have a chance to store
the new fork's pid in its process structure */
sigemptyset (&blocked);
-#ifdef SIGCHLD
sigaddset (&blocked, SIGCHLD);
-#endif
-#ifdef HAVE_WORKING_VFORK
- /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal',
- this sets the parent's signal handlers as well as the child's.
- So delay all interrupts whose handlers the child might munge,
- and record the current handlers so they can be restored later. */
- sigaddset (&blocked, SIGINT ); sigaction (SIGINT , 0, &sigint_action );
- sigaddset (&blocked, SIGQUIT); sigaction (SIGQUIT, 0, &sigquit_action);
- sigaddset (&blocked, SIGPIPE); sigaction (SIGPIPE, 0, &sigpipe_action);
-#ifdef AIX
- sigaddset (&blocked, SIGHUP ); sigaction (SIGHUP , 0, &sighup_action );
-#endif
-#endif /* HAVE_WORKING_VFORK */
pthread_sigmask (SIG_BLOCK, &blocked, &procmask);
+#endif
FD_SET (inchannel, &input_wait_mask);
FD_SET (inchannel, &non_keyboard_wait_mask);
in the child. */
signal (SIGPIPE, SIG_DFL);
+#ifdef SIGCHLD
/* Stop blocking signals in the child. */
pthread_sigmask (SIG_SETMASK, &procmask, 0);
+#endif
if (pty_flag)
child_setup_tty (xforkout);
#endif
}
- /* Restore the signal state whether vfork succeeded or not.
- (We will signal an error, below, if it failed.) */
-#ifdef HAVE_WORKING_VFORK
- /* Restore the parent's signal handlers. */
- sigaction (SIGINT, &sigint_action, 0);
- sigaction (SIGQUIT, &sigquit_action, 0);
- sigaction (SIGPIPE, &sigpipe_action, 0);
-#ifdef AIX
- sigaction (SIGHUP, &sighup_action, 0);
-#endif
-#endif /* HAVE_WORKING_VFORK */
+#ifdef SIGCHLD
/* Stop blocking signals in the parent. */
pthread_sigmask (SIG_SETMASK, &procmask, 0);
+#endif
/* Now generate the error if vfork failed. */
if (pid < 0)