* bug#26397: 25.1; call-process slow on macOS and slower on larger frames @ 2017-04-08 6:25 Aaron Jensen 2017-04-08 7:37 ` YAMAMOTO Mitsuharu 0 siblings, 1 reply; 17+ messages in thread From: Aaron Jensen @ 2017-04-08 6:25 UTC (permalink / raw) To: 26397 It seems that `call-process' on macOS is quite a bit slower than it is on linux. Not only that, but the performance degrades as the frame gets larger. Using this as a benchmark in 'emacs -Q': (benchmark 1 '(call-process "/usr/bin/true" nil nil nil)) With a small frame (default emacs size): Elapsed time: 0.003509s With a larger frame (about 1500x1500px): Elapsed time: 0.007011s On Linux it's been reported that times are typically in the 1-2ms range. I originally came across this via this magit issue: https://github.com/magit/magit/issues/2909 because magit, for many common operations, can call call-process many times, making the performance difference significant. Note that people in the thread are seeing even worse performance. Thanks, Aaron In GNU Emacs 25.1.1 (x86_64-apple-darwin15.6.0, NS appkit-1404.47 Version 10.11.6 (Build 15G1217)) of 2017-04-07 built on aaronmbp.local Windowing system distributor 'Apple', version 10.3.1404 Configured using: 'configure --disable-dependency-tracking --disable-silent-rules --enable-locallisppath=/usr/local/share/emacs/site-lisp --infodir=/usr/local/Cellar/emacs-plus/25.1/share/info/emacs --prefix=/usr/local/Cellar/emacs-plus/25.1 --with-xml2 --without-dbus --with-gnutls --with-imagemagick --with-modules --with-rsvg --with-ns --disable-ns-self-contained' Configured features: JPEG RSVG IMAGEMAGICK NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Text Minor modes in effect: eros-mode: t projectile-mode: t recentf-mode: t yas-global-mode: t yas-minor-mode: t flyspell-mode: t org-mobile-sync-mode: t magit-auto-revert-mode: t evil-mc-mode: t hl-todo-mode: t global-spacemacs-whitespace-cleanup-mode: t spacemacs-whitespace-cleanup-mode: t ws-butler-global-mode: t ws-butler-mode: t winum-mode: t winner-mode: t volatile-highlights-mode: t global-vi-tilde-fringe-mode: t vi-tilde-fringe-mode: t pupo-mode: t purpose-mode: t spaceline-info-mode: t spaceline-helm-mode: t save-place-mode: t savehist-mode: t popwin-mode: t persp-mode: t Info-breadcrumbs-in-mode-line-mode: t global-git-gutter+-mode: t global-git-commit-mode: t async-bytecomp-package-mode: t shell-dirtrack-mode: t global-flycheck-mode: t flx-ido-mode: t eyebrowse-mode: t global-evil-surround-mode: t evil-surround-mode: t global-evil-search-highlight-persist: t evil-search-highlight-persist: t show-smartparens-global-mode: t show-smartparens-mode: t evil-escape-mode: t global-anzu-mode: t anzu-mode: t eval-sexp-fu-flash-mode: t editorconfig-mode: t dtrt-indent-mode: t diff-auto-refine-mode: t counsel-mode: t ivy-mode: t clean-aindent-mode: t hybrid-mode: t which-key-mode: t override-global-mode: t global-undo-tree-mode: t undo-tree-mode: t evil-mode: t evil-local-mode: t spacemacs-leader-override-mode: t global-spacemacs-leader-override-mode: t global-hl-line-mode: t xterm-mouse-mode: t global-auto-revert-mode: t ido-vertical-mode: t global-page-break-lines-mode: t global-eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t column-number-mode: t line-number-mode: t auto-fill-function: yas--auto-fill transient-mark-mode: t abbrev-mode: t Recent messages: Added 2 events for today Saving file /Users/aaronjensen/.emacs.d/.cache/work.org... Wrote /Users/aaronjensen/.emacs.d/.cache/work.org Fetched data overwrote /Users/aaronjensen/.emacs.d/.cache/work.org org-mode fontification error in #<buffer Programming.org> at 37 org-mode fontification error in #<buffer Programming.org> at 55 org-mode fontification error in #<buffer emacs.org> at 19 org-mode fontification error in #<buffer todo.org> at 107 Added 2 events for today Load-path shadows: /Users/aaronjensen/.emacs.d/elpa/25.1/org-bullets-20140918.1137/org-bullets hides /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-bullets /Users/aaronjensen/.emacs.d/elpa/25.1/ht-20161015.1945/ht hides /Users/aaronjensen/.emacs.d/core/libs/ht /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-texinfo hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-texinfo /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-publish hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-publish /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-org hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-org /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-odt hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-odt /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-md hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-md /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-man hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-man /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-latex hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-latex /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-icalendar hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-icalendar /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-html hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-html /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-beamer hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-beamer /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ox-ascii hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ox-ascii /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-w3m hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-w3m /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-version hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-version /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-timer hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-timer /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-table hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-table /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-src hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-src /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-rmail hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-rmail /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-protocol hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-protocol /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-plot hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-plot /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-pcomplete hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-pcomplete /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-mouse hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-mouse /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-mobile hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-mobile /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-mhe hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-mhe /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-macs hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-macs /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-macro hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-macro /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-loaddefs hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-loaddefs /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-list hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-list /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-irc hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-irc /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-install hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-install /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-inlinetask hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-inlinetask /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-info hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-info /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-indent hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-indent /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-id hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-id /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-habit hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-habit /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-gnus hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-gnus /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-footnote hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-footnote /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-feed hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-feed /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-faces hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-faces /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-eshell hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-eshell /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-entities hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-entities /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-element hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-element /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-docview hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-docview /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-datetree hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-datetree /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-ctags hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-ctags /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-crypt hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-crypt /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-compat hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-compat /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-colview hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-colview /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-clock hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-clock /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-capture hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-capture /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-bibtex hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-bibtex /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-bbdb hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-bbdb /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-attach hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-attach /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-archive hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-archive /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/org-agenda hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/org-agenda /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-tangle hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-tangle /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-table hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-table /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-sqlite hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-sqlite /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-sql hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-sql /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-shen hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-shen /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-screen hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-screen /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-scheme hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-scheme /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-scala hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-scala /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-sass hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-sass /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-ruby hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-ruby /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-ref hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-ref /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-R hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-R /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-python hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-python /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-plantuml hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-plantuml /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-picolisp hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-picolisp /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-perl hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-perl /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-org hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-org /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-octave hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-octave /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-ocaml hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-ocaml /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-mscgen hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-mscgen /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-maxima hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-maxima /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-matlab hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-matlab /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-makefile hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-makefile /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-lob hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-lob /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-lisp hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-lisp /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-lilypond hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-lilypond /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-ledger hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-ledger /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-latex hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-latex /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-keys hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-keys /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-js hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-js /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-java hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-java /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-io hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-io /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-haskell hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-haskell /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-gnuplot hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-gnuplot /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-fortran hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-fortran /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-exp hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-exp /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-eval hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-eval /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-emacs-lisp hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-emacs-lisp /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-dot hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-dot /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-ditaa hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-ditaa /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-css hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-css /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-core hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-core /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-comint hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-comint /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-clojure hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-clojure /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-calc hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-calc /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-C hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-C /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-awk hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-awk /Users/aaronjensen/.emacs.d/elpa/25.1/org-plus-contrib-20170210/ob-asymptote hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/org/ob-asymptote /Users/aaronjensen/.emacs.d/elpa/25.1/seq-2.19/seq hides /usr/local/Cellar/emacs-plus/25.1/share/emacs/25.1/lisp/emacs-lisp/seq Features: (shadow sort mail-extr emacsbug sendmail appt diary-lib diary-loaddefs alchemist alchemist-macroexpand alchemist-company alchemist-help alchemist-complete alchemist-refcard alchemist-phoenix alchemist-compile alchemist-iex alchemist-message alchemist-hooks alchemist-hex alchemist-mix alchemist-info alchemist-goto alchemist-scope alchemist-eval alchemist-interact alchemist-server alchemist-execute alchemist-report alchemist-test-mode alchemist-project alchemist-file alchemist-key alchemist-utils smartparens-elixir flycheck-dialyxir flycheck-credo flycheck-dogma elixir-mode pkg-info epl elixir-smie sh-script executable pp benchmark elp colir smex magit-gitflow vc-git auto-compile packed elisp-slime-nav eros evil-cleverparens evil-cleverparens-text-objects evil-cleverparens-util paredit flycheck-package package-lint finder nameless goto-addr bug-reference auto-highlight-symbol highlight-numbers parent-mode highlight-parentheses hideshow rainbow-delimiters projectile grep compile open-junk-file recentf tree-widget company-files company-keywords company-etags company-gtags company-template company-dabbrev-code company-dabbrev company-capf company org-eldoc evil-org ob-clojure ob-shell org-bullets org-download toc-org clojure-snippets yasnippet flyspell ispell org-indent image-file org-rmail org-mhe org-irc org-info org-gnus nnir org-docview doc-view org-bibtex bibtex org-bbdb org-w3m editorconfig-core editorconfig-core-handle editorconfig-fnmatch org-mobile-sync org-mobile org-agenda org-gcal org-archive ob-elixir ob-http ob-http-mode ob-restclient restclient ox-gfm ox-md ox-reveal ox-odt rng-loc rng-uri rng-parse rng-match rng-dt rng-util rng-pttrn nxml-parse nxml-ns nxml-enc xmltok nxml-util ox-latex ox-icalendar ox-html table ox-ascii ox-publish ox orgit org-element avl-tree magithub magithub-ci magithub-issue magithub-proxy magithub-cache magithub-core git-rebase magit-gh-pulls gh gh-users gh-issues gh-pulls gh-repos gh-comments gh-gist gh-oauth gh-api logito gh-cache pcache eieio-base gh-auth gh-url url-http url-auth url-gw evil-magit magit-obsolete magit-blame magit-stash magit-bisect magit-remote magit-commit magit-sequence magit-notes magit-worktree magit-branch magit-files magit-refs magit-status magit magit-repos magit-apply magit-wip magit-log magit-diff smerge-mode magit-core magit-autorevert magit-process magit-margin magit-mode magit-git crm magit-section magit-popup org org-macro org-footnote org-pcomplete org-list org-faces org-entities org-version ob-emacs-lisp ob ob-tangle org-src ob-ref ob-lob ob-table ob-keys ob-exp ob-comint ob-core ob-eval org-compat org-macs org-loaddefs cal-menu calendar cal-loaddefs gnus-sum gnus-group gnus-undo gnus-start gnus-cloud nnimap nnmail mail-source tls gnutls utf7 netrc nnoo parse-time gnus-spec gnus-int gnus-range gnus-win gnus gnus-ems nnheader request-deferred deferred request url url-proxy url-privacy url-expand url-methods url-history url-cookie url-domsuf url-util mailcap alert log4e notifications dbus xml gntp fill-or-unfill company-simple-complete init-typescript init-flyspell init-terminal-cursor evil-terminal-cursor-changer init-org init-magit evil-mc evil-mc-command-execute evil-mc-command-record evil-mc-cursor-make evil-mc-region evil-mc-cursor-state evil-mc-undo evil-mc-vars evil-mc-known-commands evil-mc-common hl-todo xterm-color spacemacs-whitespace-cleanup ws-butler winum winner window-purpose-x imenu-list imenu ibuf-ext ibuffer volatile-highlights vi-tilde-fringe tmux spacemacs-purpose-popwin window-purpose window-purpose-fixes window-purpose-prefix-overload window-purpose-switch let-alist window-purpose-layout window-purpose-core window-purpose-configuration window-purpose-utils spaceline-config spaceline-segments spaceline powerline powerline-separators color powerline-themes smartparens-config smartparens-ruby saveplace savehist ruby-test-mode pcre2el rxt re-builder ruby-mode smie popwin persp-mode osx-trash linum ivy-hydra info+ image-mode git-gutter-fringe+ fringe-helper git-gutter+ git-commit with-editor async-bytecomp async tramp-sh server magit-utils log-edit message dired rfc822 mml mml-sec epg mailabbrev mail-utils gmm-utils mailheader pcvs-util add-log docker-tramp tramp-cache tramp tramp-compat tramp-loaddefs trampver shell pcomplete comint ansi-color gh-common gh-profile marshal flycheck-flow flycheck find-func flx-ido eyebrowse format-spec evil-unimpaired f s evil-surround evil-search-highlight-persist evil-numbers evil-lisp-state smartparens dash evil-indent-plus evil-exchange evil-escape evil-args evil-anzu anzu cider-eval-sexp-fu eval-sexp-fu highlight editorconfig rx noutline outline dtrt-indent diff-hl vc-dir ewoc vc vc-dispatcher diff-mode counsel jka-compr esh-util etags xref project swiper ivy flx delsel ivy-overlay ffap clean-aindent-mode adaptive-wrap hybrid-mode exec-path-from-shell evil-evilified-state which-key use-package diminish bind-key hydra lv cus-edit cus-start cus-load evil evil-integration undo-tree diff evil-maps evil-commands evil-jumps evil-command-window evil-types evil-search evil-ex evil-macros evil-repeat evil-states evil-core evil-common windmove thingatpt rect evil-digraphs evil-vars ring info bind-map quelpa url-parse auth-source gnus-util password-cache url-vars package-build mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mm-util help-fns mail-prsvr json map lisp-mnt hl-line xt-mouse autorevert filenotify disp-table wid-edit monokai-theme finder-inf init-html init-evil core-configuration-layer eieio-compat cl-seq ht cl warnings package epg-config eieio eieio-core ido-vertical-mode ido seq byte-opt bytecomp byte-compile cl-extra help-mode cconv core-spacemacs core-use-package-ext core-transient-state core-micro-state core-toggle core-keybindings core-fonts-support core-spacemacs-buffer core-funcs cl-macs gv core-themes-support core-display-init core-jump core-release-management core-custom-settings core-dotspacemacs core-command-line core-debug edmacro kmacro derived advice profiler easymenu cl-loaddefs cl-lib page-break-lines easy-mmode subr-x pcase time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel ns-win ucs-normalize term/common-win tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese charscript case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote kqueue cocoa ns multi-tty make-network-process emacs) Memory information: ((conses 16 1382315 1069177) (symbols 48 78704 104) (miscs 40 2030 4673) (strings 32 216243 449110) (string-bytes 1 7392222) (vectors 16 114771) (vector-slots 8 2277782 350545) (floats 8 4739 6194) (intervals 56 35013 7656) (buffers 976 55)) ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: 25.1; call-process slow on macOS and slower on larger frames 2017-04-08 6:25 bug#26397: 25.1; call-process slow on macOS and slower on larger frames Aaron Jensen @ 2017-04-08 7:37 ` YAMAMOTO Mitsuharu 2017-04-08 15:47 ` Aaron Jensen 0 siblings, 1 reply; 17+ messages in thread From: YAMAMOTO Mitsuharu @ 2017-04-08 7:37 UTC (permalink / raw) To: Aaron Jensen; +Cc: 26397 >>>>> On Fri, 7 Apr 2017 23:25:24 -0700, Aaron Jensen <aaronjensen@gmail.com> said: > It seems that `call-process' on macOS is quite a bit slower than it is > on linux. Not only that, but the performance degrades as the frame gets > larger. > Using this as a benchmark in 'emacs -Q': > (benchmark 1 '(call-process "/usr/bin/true" nil nil nil)) > With a small frame (default emacs size): > Elapsed time: 0.003509s > With a larger frame (about 1500x1500px): > Elapsed time: 0.007011s > On Linux it's been reported that times are typically in the 1-2ms range. > I originally came across this via this magit issue: > https://github.com/magit/magit/issues/2909 because magit, for many > common operations, can call call-process many times, making the > performance difference significant. Note that people in the thread are > seeing even worse performance. Probably "fork" copies some GUI resources. That would also explain why the performance is worse on the Mac port, where each frame allocates an extra NSWindow for overlaying. It becomes much faster and seemingly unaffected by the frame size if you comment out "#undef HAVE_WORKING_VFORK" and "#define vfork fork" in src/conf_post.h. But I'm not sure if it is safe. YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: 25.1; call-process slow on macOS and slower on larger frames 2017-04-08 7:37 ` YAMAMOTO Mitsuharu @ 2017-04-08 15:47 ` Aaron Jensen 2017-04-08 19:19 ` Alan Third 0 siblings, 1 reply; 17+ messages in thread From: Aaron Jensen @ 2017-04-08 15:47 UTC (permalink / raw) To: YAMAMOTO Mitsuharu; +Cc: 26397 On Sat, Apr 8, 2017 at 12:37 AM, YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> wrote: > > Probably "fork" copies some GUI resources. That would also explain > why the performance is worse on the Mac port, where each frame > allocates an extra NSWindow for overlaying. > > It becomes much faster and seemingly unaffected by the frame size if > you comment out "#undef HAVE_WORKING_VFORK" and "#define vfork fork" > in src/conf_post.h. But I'm not sure if it is safe. Wow, that does make a big difference. The comment says that Emacs hangs when evaluating: (make-comint "test0" "/nodir/nofile" nil "") But I can not reproduce that currently with vfork. I do not understand the second comment: "Also, setsid is not allowed in the vfork child's context as of Darwin 9/Mac OS X 10.5." How might I test that? I'm happy to run with a build that has this change for a while and see how it goes. Perhaps this is no longer an issue in current macOS? Are there any version specific pragmas for osx? ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: 25.1; call-process slow on macOS and slower on larger frames 2017-04-08 15:47 ` Aaron Jensen @ 2017-04-08 19:19 ` Alan Third 2017-04-09 13:01 ` Alan Third 0 siblings, 1 reply; 17+ messages in thread From: Alan Third @ 2017-04-08 19:19 UTC (permalink / raw) To: Aaron Jensen; +Cc: 26397 On Sat, Apr 08, 2017 at 08:47:25AM -0700, Aaron Jensen wrote: > On Sat, Apr 8, 2017 at 12:37 AM, YAMAMOTO Mitsuharu > <mituharu@math.s.chiba-u.ac.jp> wrote: > > > > Probably "fork" copies some GUI resources. That would also explain > > why the performance is worse on the Mac port, where each frame > > allocates an extra NSWindow for overlaying. > > > > It becomes much faster and seemingly unaffected by the frame size if > > you comment out "#undef HAVE_WORKING_VFORK" and "#define vfork fork" > > in src/conf_post.h. But I'm not sure if it is safe. > > Wow, that does make a big difference. The comment says that Emacs > hangs when evaluating: > > (make-comint "test0" "/nodir/nofile" nil "") > > But I can not reproduce that currently with vfork. I do not understand > the second comment: "Also, setsid is not allowed in the vfork child's > context as of Darwin 9/Mac OS X 10.5." It looks to me like we could replace the call to setsid with setpgid (0, 0); for Darwin builds. However I can’t tell for sure if that function is allowed after vfork, as I can’t even find any official reference to setsid not being allowed. I’m probably just not looking hard enough. It seems the ‘correct’ solution for macOS is to use posix_spawn instead of (v)fork/exec, but that would probably require a larger change, and Daniel Colascione seems to have looked into it before, and come across this very issue: https://lists.gnu.org/archive/html/emacs-devel/2012-01/msg00078.html He doesn’t seem to have got an answer, though, and Emacs no longer falls back to setpgid on any platform (see commit dd0333b6155c9c3aabdac9418c005e2e5b4796e7). > How might I test that? The call to setsid is inside an `if` that’s to do with ptys. I suspect it must come into play if you’re using Emacs in a text terminal, rather than as a GUI app. I can’t check this just now as my master won’t build... -- Alan Third ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: 25.1; call-process slow on macOS and slower on larger frames 2017-04-08 19:19 ` Alan Third @ 2017-04-09 13:01 ` Alan Third 2017-04-09 15:07 ` Aaron Jensen 0 siblings, 1 reply; 17+ messages in thread From: Alan Third @ 2017-04-09 13:01 UTC (permalink / raw) To: Aaron Jensen; +Cc: 26397 On Sat, Apr 08, 2017 at 08:19:59PM +0100, Alan Third wrote: > On Sat, Apr 08, 2017 at 08:47:25AM -0700, Aaron Jensen wrote: > > On Sat, Apr 8, 2017 at 12:37 AM, YAMAMOTO Mitsuharu > > <mituharu@math.s.chiba-u.ac.jp> wrote: > > > > > > Probably "fork" copies some GUI resources. That would also explain > > > why the performance is worse on the Mac port, where each frame > > > allocates an extra NSWindow for overlaying. > > > > > > It becomes much faster and seemingly unaffected by the frame size if > > > you comment out "#undef HAVE_WORKING_VFORK" and "#define vfork fork" > > > in src/conf_post.h. But I'm not sure if it is safe. > > > > Wow, that does make a big difference. The comment says that Emacs > > hangs when evaluating: > > > > (make-comint "test0" "/nodir/nofile" nil "") > > > > But I can not reproduce that currently with vfork. I can’t reproduce a hang with that command either. > > I do not understand the second comment: "Also, setsid is not > > allowed in the vfork child's context as of Darwin 9/Mac OS X > > 10.5." > > It looks to me like we could replace the call to setsid with > > setpgid (0, 0); > > for Darwin builds. No, forget that. It doesn’t do the same thing at all. If you run Emacs, then M‐x ansi-term RET RET You should get a shell prompt. Using fork/setsid, your shell will be able to do job control, but using vfork it can’t. You can test this by typing the `bg` command. Zsh (and I assume bash, etc.) responds by telling you either there are no jobs, or that the shell has no job control. We could work around this in a rather ugly manner by doing something like: #ifdef DARWIN_OS if (pty_flag) pid = fork (); else pid = vfork (); #else pid = vfork (); #endif which would use fork where we’re expecting to run setsid, and vfork otherwise. -- Alan Third ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: 25.1; call-process slow on macOS and slower on larger frames 2017-04-09 13:01 ` Alan Third @ 2017-04-09 15:07 ` Aaron Jensen 2017-04-09 19:18 ` bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) Alan Third 0 siblings, 1 reply; 17+ messages in thread From: Aaron Jensen @ 2017-04-09 15:07 UTC (permalink / raw) To: Alan Third; +Cc: 26397 That appears to work for me. Here's the patch I'm trying out: https://gist.githubusercontent.com/aaronjensen/28e26a6c6c0dc767176bc35d5545d10e/raw/7fbbfa48fcf26d083e38cec9f174cef911a806ca/GNU-Emacs-25.1-OS-X-enable-vfork.patch ======================================================= From 4a9221e2332d85d64978719a43f884b92bf6cb7b Mon Sep 17 00:00:00 2001 From: Aaron Jensen <aaronjensen@gmail.com> Date: Sat, 8 Apr 2017 08:32:57 -0700 Subject: [PATCH 1/2] Enable vfork on macOS --- src/conf_post.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/conf_post.h b/src/conf_post.h index 209f60792c..04c5cd6cf6 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -87,8 +87,8 @@ typedef bool bool_bf; (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 +/* #undef HAVE_WORKING_VFORK */ +/* #define vfork fork */ #endif /* DARWIN_OS */ /* If HYBRID_MALLOC is defined (e.g., on Cygwin), emacs will use -- 2.12.2 From 9a15fda33bf2b369207701b66cd8f93e2d3a8801 Mon Sep 17 00:00:00 2001 From: Aaron Jensen <aaronjensen@gmail.com> Date: Sun, 9 Apr 2017 07:43:25 -0700 Subject: [PATCH 2/2] Only vfork if not pty --- src/process.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/process.c b/src/process.c index 7ab92b0102..b49d5970c8 100644 --- a/src/process.c +++ b/src/process.c @@ -1811,7 +1811,14 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir) int volatile forkerr_volatile = forkerr; struct Lisp_Process *p_volatile = p; - pid = vfork (); + #ifdef DARWIN_OS + 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 On Sun, Apr 9, 2017 at 6:01 AM, Alan Third <alan@idiocy.org> wrote: > On Sat, Apr 08, 2017 at 08:19:59PM +0100, Alan Third wrote: >> On Sat, Apr 08, 2017 at 08:47:25AM -0700, Aaron Jensen wrote: >> > On Sat, Apr 8, 2017 at 12:37 AM, YAMAMOTO Mitsuharu >> > <mituharu@math.s.chiba-u.ac.jp> wrote: >> > > >> > > Probably "fork" copies some GUI resources. That would also explain >> > > why the performance is worse on the Mac port, where each frame >> > > allocates an extra NSWindow for overlaying. >> > > >> > > It becomes much faster and seemingly unaffected by the frame size if >> > > you comment out "#undef HAVE_WORKING_VFORK" and "#define vfork fork" >> > > in src/conf_post.h. But I'm not sure if it is safe. >> > >> > Wow, that does make a big difference. The comment says that Emacs >> > hangs when evaluating: >> > >> > (make-comint "test0" "/nodir/nofile" nil "") >> > >> > But I can not reproduce that currently with vfork. > > I can’t reproduce a hang with that command either. > >> > I do not understand the second comment: "Also, setsid is not >> > allowed in the vfork child's context as of Darwin 9/Mac OS X >> > 10.5." >> >> It looks to me like we could replace the call to setsid with >> >> setpgid (0, 0); >> >> for Darwin builds. > > No, forget that. It doesn’t do the same thing at all. > > If you run Emacs, then > > M‐x ansi-term RET RET > > You should get a shell prompt. Using fork/setsid, your shell will be > able to do job control, but using vfork it can’t. You can test this by > typing the `bg` command. Zsh (and I assume bash, etc.) responds by > telling you either there are no jobs, or that the shell has no job > control. > > We could work around this in a rather ugly manner by doing something like: > > #ifdef DARWIN_OS > if (pty_flag) > pid = fork (); > else > pid = vfork (); > #else > pid = vfork (); > #endif > > which would use fork where we’re expecting to run setsid, and vfork > otherwise. > > -- > Alan Third ^ permalink raw reply related [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-09 15:07 ` Aaron Jensen @ 2017-04-09 19:18 ` Alan Third 2017-04-09 20:32 ` Andreas Schwab 2017-04-09 23:46 ` YAMAMOTO Mitsuharu 0 siblings, 2 replies; 17+ messages in thread From: Alan Third @ 2017-04-09 19:18 UTC (permalink / raw) To: Aaron Jensen; +Cc: 26397 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; -- Here’s a tidied up version. If nobody complains I’ll push it in a few days. Thanks for your help. -- Alan Third ^ permalink raw reply related [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-09 19:18 ` bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) Alan Third @ 2017-04-09 20:32 ` Andreas Schwab 2017-04-09 21:34 ` Alan Third 2017-04-09 23:46 ` YAMAMOTO Mitsuharu 1 sibling, 1 reply; 17+ messages in thread From: Andreas Schwab @ 2017-04-09 20:32 UTC (permalink / raw) To: Alan Third; +Cc: 26397, Aaron Jensen On Apr 09 2017, Alan Third <alan@idiocy.org> wrote: > src/conf_post.h: Remove defines forcing use of fork. That should list the removed macros. * src/conf_post.h (HAVE_WORKING_VFORK): Don't undef. (vfork): Don't define. > src/process.c (create_process): Use fork if pty_flag is set, otherwise > vfork. That should say that it is only used when DARWIN_OS is defined. * src/process.c (create_process) [DARWIN_OS]: Use fork if pty_flag is set, otherwise vfork. Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-09 20:32 ` Andreas Schwab @ 2017-04-09 21:34 ` Alan Third 0 siblings, 0 replies; 17+ messages in thread From: Alan Third @ 2017-04-09 21:34 UTC (permalink / raw) To: Andreas Schwab; +Cc: 26397, Aaron Jensen On Sun, Apr 09, 2017 at 10:32:52PM +0200, Andreas Schwab wrote: > On Apr 09 2017, Alan Third <alan@idiocy.org> wrote: > > > src/conf_post.h: Remove defines forcing use of fork. > > That should list the removed macros. > > * src/conf_post.h (HAVE_WORKING_VFORK): Don't undef. > (vfork): Don't define. > > > src/process.c (create_process): Use fork if pty_flag is set, otherwise > > vfork. > > That should say that it is only used when DARWIN_OS is defined. > > * src/process.c (create_process) [DARWIN_OS]: Use fork if > pty_flag is set, otherwise vfork. Thank you. I’ve fixed those now. -- Alan Third ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-09 19:18 ` bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) Alan Third 2017-04-09 20:32 ` Andreas Schwab @ 2017-04-09 23:46 ` YAMAMOTO Mitsuharu 2017-04-10 0:06 ` Aaron Jensen 1 sibling, 1 reply; 17+ messages in thread From: YAMAMOTO Mitsuharu @ 2017-04-09 23:46 UTC (permalink / raw) To: Alan Third; +Cc: 26397, Aaron Jensen >>>>> On Sun, 9 Apr 2017 20:18:49 +0100, Alan Third <alan@idiocy.org> said: > src/conf_post.h: Remove defines forcing use of fork. > src/process.c (create_process): Use fork if pty_flag is set, otherwise > vfork. With this patch, setsid in callproc.c gets called in a vfork child context. It results in EPERM on Darwin. According to ChangeLog, setsid in callproc.c seems to be used for disconnecting from the controlling terminal (so as to avoid using /dev/tty accidentally?). 1997-06-11 Paul Eggert <eggert@twinsun.com> * callproc.c (Fcall_process): Use setsid to disconnect child process from controlling terminal. If that is the case (i.e., if we don't have to make the child process a session leader), then we don't need setsid when the Emacs process doesn't have the controlling terminal, which is common for Mac-native GUI sessions. It doesn't apply for TTY or X11 sessions, but fork is not that slow there. YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp diff --git a/src/callproc.c b/src/callproc.c index 1e3d661eef..b3ffeb57af 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -591,6 +591,20 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd, pid = child_setup (filefd, fd_output, fd_error, new_argv, 0, current_dir); #else /* not WINDOWSNT */ +#ifdef DARWIN_OS + /* Darwin doesn't let us run setsid after a vfork, so use fork when + necessary. */ + bool did_fork_p; + int ctfd = emacs_open ("/dev/tty", O_NOCTTY, 0); + + if (ctfd >= 0) + { + emacs_close (ctfd); + pid = fork (); + did_fork_p = true; + } + else +#endif /* vfork, and prevent local vars from being clobbered by the vfork. */ { Lisp_Object volatile buffer_volatile = buffer; @@ -609,6 +623,9 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd, callproc_fd_volatile[i] = callproc_fd[i]; pid = vfork (); +#ifdef DARWIN_OS + did_fork_p = false; +#endif buffer = buffer_volatile; coding_systems = coding_systems_volatile; @@ -631,6 +648,9 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int filefd, { unblock_child_signal (&oldset); +#ifdef DARWIN_OS + if (did_fork_p) +#endif setsid (); /* Emacs ignores SIGPIPE, but the child should not. */ ^ permalink raw reply related [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-09 23:46 ` YAMAMOTO Mitsuharu @ 2017-04-10 0:06 ` Aaron Jensen 2017-04-10 1:11 ` YAMAMOTO Mitsuharu 0 siblings, 1 reply; 17+ messages in thread From: Aaron Jensen @ 2017-04-10 0:06 UTC (permalink / raw) To: YAMAMOTO Mitsuharu; +Cc: 26397, Alan Third On Sun, Apr 9, 2017 at 4:46 PM, YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> wrote: > According to ChangeLog, setsid in callproc.c seems to be used for > disconnecting from the controlling terminal (so as to avoid using > /dev/tty accidentally?). > > 1997-06-11 Paul Eggert <eggert@twinsun.com> > > * callproc.c (Fcall_process): Use setsid to disconnect child > process from controlling terminal. > > If that is the case (i.e., if we don't have to make the child process > a session leader), then we don't need setsid when the Emacs process > doesn't have the controlling terminal, which is common for Mac-native > GUI sessions. It doesn't apply for TTY or X11 sessions, but fork is > not that slow there. For me, this slows down call-process in TTY emacs by 3ms (from 2.5ms->5.5ms). I typically launch a GUI emacs and connect to the server in TTY via emacsclient, and in that scenario this patch does not slow down call-process in the TTY, but it will affect those who use TTY only, it seems. Aaron ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-10 0:06 ` Aaron Jensen @ 2017-04-10 1:11 ` YAMAMOTO Mitsuharu 2017-04-10 4:13 ` Aaron Jensen 2017-04-10 15:42 ` bug#26397: [PATCH v2] " Alan Third 0 siblings, 2 replies; 17+ messages in thread From: YAMAMOTO Mitsuharu @ 2017-04-10 1:11 UTC (permalink / raw) To: Aaron Jensen; +Cc: 26397, Alan Third >>>>> On Sun, 9 Apr 2017 17:06:21 -0700, Aaron Jensen <aaronjensen@gmail.com> said: > For me, this slows down call-process in TTY emacs by 3ms (from > 2.5ms->5.5ms). I typically launch a GUI emacs and connect to the > server in TTY via emacsclient, and in that scenario this patch does > not slow down call-process in the TTY, but it will affect those who > use TTY only, it seems. Then use "obsolete" ioctl TIOCNOTTY instead of setsid? I'm not familiar with this matter, so could someone check if this is OK? I confirmed that only the controlling terminal of the child process was detached. YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp 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); ^ permalink raw reply related [flat|nested] 17+ messages in thread
* bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) 2017-04-10 1:11 ` YAMAMOTO Mitsuharu @ 2017-04-10 4:13 ` Aaron Jensen 2017-04-10 15:42 ` bug#26397: [PATCH v2] " Alan Third 1 sibling, 0 replies; 17+ messages in thread From: Aaron Jensen @ 2017-04-10 4:13 UTC (permalink / raw) To: YAMAMOTO Mitsuharu; +Cc: 26397, Alan Third On Sun, Apr 9, 2017 at 6:11 PM, YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> wrote: >>>>>> On Sun, 9 Apr 2017 17:06:21 -0700, Aaron Jensen <aaronjensen@gmail.com> said: > >> For me, this slows down call-process in TTY emacs by 3ms (from >> 2.5ms->5.5ms). I typically launch a GUI emacs and connect to the >> server in TTY via emacsclient, and in that scenario this patch does >> not slow down call-process in the TTY, but it will affect those who >> use TTY only, it seems. > > Then use "obsolete" ioctl TIOCNOTTY instead of setsid? I'm not > familiar with this matter, so could someone check if this is OK? I > confirmed that only the controlling terminal of the child process was > detached. Performance-wise this worked for me in both TTY and non-TTY. I can't speak to this being an OK approach, however. Thank you! ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: [PATCH v2] Use vfork if possible on Darwin (bug#26397) 2017-04-10 1:11 ` YAMAMOTO Mitsuharu 2017-04-10 4:13 ` Aaron Jensen @ 2017-04-10 15:42 ` Alan Third 2017-04-11 7:06 ` YAMAMOTO Mitsuharu 2017-04-18 2:29 ` Aaron Jensen 1 sibling, 2 replies; 17+ messages in thread From: Alan Third @ 2017-04-10 15:42 UTC (permalink / raw) To: YAMAMOTO Mitsuharu; +Cc: 26397, Alan Third, Aaron Jensen * 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. --- src/callproc.c | 13 +++++++++++++ src/conf_post.h | 6 ------ src/process.c | 9 +++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/callproc.c b/src/callproc.c index 05048576ce..792556c8e0 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); 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; -- This patch includes everything so far. I can’t say whether the TIOCNOTTY approach is correct either, unfortunately. Yamamoto‐san, I’m aware this is mostly your work, so if you’d prefer I’m happy for you to commit it in your name. -- Alan Third ^ permalink raw reply related [flat|nested] 17+ messages in thread
* bug#26397: [PATCH v2] Use vfork if possible on Darwin (bug#26397) 2017-04-10 15:42 ` bug#26397: [PATCH v2] " Alan Third @ 2017-04-11 7:06 ` YAMAMOTO Mitsuharu 2017-04-18 2:29 ` Aaron Jensen 1 sibling, 0 replies; 17+ messages in thread From: YAMAMOTO Mitsuharu @ 2017-04-11 7:06 UTC (permalink / raw) To: Alan Third; +Cc: 26397, Aaron Jensen >>>>> On Mon, 10 Apr 2017 16:42:11 +0100, Alan Third <alan@idiocy.org> said: > I can’t say whether the TIOCNOTTY approach is correct either, > unfortunately. > Yamamoto‐san, I’m aware this is mostly your work, so if you’d prefer > I’m happy for you to commit it in your name. You've set up the commit message and the process.c part. Please add me as a co-author (as described in the CONTRIBUTE file) and commit it if no one is against the TIOCNOTTY approach. YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: [PATCH v2] Use vfork if possible on Darwin (bug#26397) 2017-04-10 15:42 ` bug#26397: [PATCH v2] " Alan Third 2017-04-11 7:06 ` YAMAMOTO Mitsuharu @ 2017-04-18 2:29 ` Aaron Jensen 2017-04-18 10:48 ` Alan Third 1 sibling, 1 reply; 17+ messages in thread From: Aaron Jensen @ 2017-04-18 2:29 UTC (permalink / raw) To: Alan Third; +Cc: 26397 On Mon, Apr 10, 2017 at 8:42 AM, Alan Third <alan@idiocy.org> wrote: > This patch includes everything so far. I've been using this patch all week and no hiccups from what I can tell. I'm really enjoying the new found responsiveness in Magit. Is this ready to apply? ^ permalink raw reply [flat|nested] 17+ messages in thread
* bug#26397: [PATCH v2] Use vfork if possible on Darwin (bug#26397) 2017-04-18 2:29 ` Aaron Jensen @ 2017-04-18 10:48 ` Alan Third 0 siblings, 0 replies; 17+ messages in thread From: Alan Third @ 2017-04-18 10:48 UTC (permalink / raw) To: Aaron Jensen; +Cc: 26397 On Mon, Apr 17, 2017 at 07:29:56PM -0700, Aaron Jensen wrote: > On Mon, Apr 10, 2017 at 8:42 AM, Alan Third <alan@idiocy.org> wrote: > > This patch includes everything so far. > > I've been using this patch all week and no hiccups from what I can > tell. I'm really enjoying the new found responsiveness in Magit. > > Is this ready to apply? I’ve been using it with no problems either, and nobody’s complained about it, so I’ve just pushed it to master. Thanks! -- Alan Third ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2017-04-18 10:48 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-04-08 6:25 bug#26397: 25.1; call-process slow on macOS and slower on larger frames Aaron Jensen 2017-04-08 7:37 ` YAMAMOTO Mitsuharu 2017-04-08 15:47 ` Aaron Jensen 2017-04-08 19:19 ` Alan Third 2017-04-09 13:01 ` Alan Third 2017-04-09 15:07 ` Aaron Jensen 2017-04-09 19:18 ` bug#26397: [PATCH] Use vfork if possible on Darwin (bug#26397) Alan Third 2017-04-09 20:32 ` Andreas Schwab 2017-04-09 21:34 ` Alan Third 2017-04-09 23:46 ` YAMAMOTO Mitsuharu 2017-04-10 0:06 ` Aaron Jensen 2017-04-10 1:11 ` YAMAMOTO Mitsuharu 2017-04-10 4:13 ` Aaron Jensen 2017-04-10 15:42 ` bug#26397: [PATCH v2] " Alan Third 2017-04-11 7:06 ` YAMAMOTO Mitsuharu 2017-04-18 2:29 ` Aaron Jensen 2017-04-18 10:48 ` Alan Third
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.