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:
parent
4ad6be65f6
commit
a13eaddce2
3 changed files with 22 additions and 6 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue