Skip to content

Instantly share code, notes, and snippets.

@aaronjensen
Last active April 10, 2017 14:23
Show Gist options
  • Save aaronjensen/28e26a6c6c0dc767176bc35d5545d10e to your computer and use it in GitHub Desktop.
Save aaronjensen/28e26a6c6c0dc767176bc35d5545d10e to your computer and use it in GitHub Desktop.
Significantly speeds up call-process, making magit much faster. May not be safe. See http://lists.gnu.org/archive/html/bug-gnu-emacs/2017-04/msg00201.html for more info
Use vfork if possible on Darwin
src/conf_post.h: Remove defines forcing use of fork.
src/process.c (create_process): Use fork if pty_flag is set, otherwise
vfork.
---
src/conf_post.h | 6 ------
src/process.c | 9 +++++++++
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/conf_post.h b/src/conf_post.h
index 30c948e39a..95ebd5511c 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 2f2e5c1b25..47a85f1c95 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;
--
2.12.2
Use TIOCNOTTY instead of setsid on darwin
---
src/callproc.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/src/callproc.c b/src/callproc.c
index 05048576ce..3f6df422f3 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -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);
--
2.12.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment