From: Alan Third Date: Sun, 9 Apr 2017 19:10:33 +0000 (+0100) Subject: Use vfork if possible on Darwin (bug#26397) X-Git-Tag: emacs-26.0.90~521^2~603 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a13eaddce2ddbe3ba0b7f4c81715bc0fcdba99f6;p=emacs.git Use vfork if possible on Darwin (bug#26397) Co-authored-by: YAMAMOTO Mitsuharu * 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. --- diff --git a/src/callproc.c b/src/callproc.c index 05048576ce9..792556c8e02 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -52,6 +52,8 @@ along with GNU Emacs. If not, see . */ #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); diff --git a/src/conf_post.h b/src/conf_post.h index 30c948e39af..95ebd5511ca 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -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 diff --git a/src/process.c b/src/process.c index b81c7b459e3..0edd092ef66 100644 --- a/src/process.c +++ b/src/process.c @@ -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;