1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-22 05:51:11 -07:00

Use vfork if possible on Darwin (bug#26397)

Co-authored-by: YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>

* src/conf_post.h (HAVE_WORKING_VFORK): Don't undef.
(vfork): Don't define.
* src/process.c (create_process) [DARWIN_OS]: Use fork if pty_flag is
set, otherwise vfork.
* src/callproc.c (call_process) [DARWIN_OS]: Use TIOCNOTTY to detach
the controlling terminal instead of setsid.
This commit is contained in:
Alan Third 2017-04-09 20:10:33 +01:00
parent 4ad6be65f6
commit a13eaddce2
3 changed files with 22 additions and 6 deletions

View file

@ -52,6 +52,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "syswait.h"
#include "blockinput.h"
#include "frame.h"
#include "systty.h"
#include "keyboard.h"
#ifdef MSDOS
#include "msdos.h"
@ -626,7 +628,18 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd,
{
unblock_child_signal (&oldset);
#ifdef DARWIN_OS
/* Darwin doesn't let us run setsid after a vfork, so use
TIOCNOTTY when necessary. */
int j = emacs_open (DEV_TTY, O_RDWR, 0);
if (j >= 0)
{
ioctl (j, TIOCNOTTY, 0);
emacs_close (j);
}
#else
setsid ();
#endif
/* Emacs ignores SIGPIPE, but the child should not. */
signal (SIGPIPE, SIG_DFL);

View file

@ -99,12 +99,6 @@ typedef bool bool_bf;
#define realloc unexec_realloc
#define free unexec_free
#endif
/* The following solves the problem that Emacs hangs when evaluating
(make-comint "test0" "/nodir/nofile" nil "") when /nodir/nofile
does not exist. Also, setsid is not allowed in the vfork child's
context as of Darwin 9/Mac OS X 10.5. */
#undef HAVE_WORKING_VFORK
#define vfork fork
#endif /* DARWIN_OS */
/* If HYBRID_MALLOC is defined (e.g., on Cygwin), emacs will use

View file

@ -2049,7 +2049,16 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
int volatile forkerr_volatile = forkerr;
struct Lisp_Process *p_volatile = p;
#ifdef DARWIN_OS
/* Darwin doesn't let us run setsid after a vfork, so use fork when
necessary. */
if (pty_flag)
pid = fork ();
else
pid = vfork ();
#else
pid = vfork ();
#endif
current_dir = current_dir_volatile;
lisp_pty_name = lisp_pty_name_volatile;