GNU bug report logs - #34847
27.0.50; auto-revert-buffers occasionally selects a killed buffer

Previous Next

Package: emacs;

Reported by: Dale Sedivec <dale <at> codefu.org>

Date: Wed, 13 Mar 2019 18:09:01 UTC

Severity: normal

Tags: fixed, patch

Merged with 35755

Found in version 27.0.50

Done: "Basil L. Contovounesios" <contovob <at> tcd.ie>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 34847 in the body.
You can then email your comments to 34847 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Wed, 13 Mar 2019 18:09:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Dale Sedivec <dale <at> codefu.org>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 13 Mar 2019 18:09:01 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Dale Sedivec <dale <at> codefu.org>
To: bug-gnu-emacs <at> gnu.org
Subject: 27.0.50; auto-revert-buffers occasionally selects a killed buffer
Date: Wed, 13 Mar 2019 13:03:35 -0500
Lately, while in the process of using Magit, I've frequently gotten
"Selecting deleting buffer" errors.  Here's a backtrace I got while
exiting magit-ediff:

~~~~~~
Debugger entered--Lisp error: (error "Selecting deleted buffer")
  set-buffer(#<killed buffer>)
  (save-current-buffer (set-buffer buf) (if (buffer-live-p buf) (progn
(if (and (not auto-revert-mode) (not auto-revert-tail-mode) (memq buf
auto-revert-buffer-list)) (auto-revert-remove-current-buffer)) (if
(auto-revert-active-p) (progn (if (and auto-revert-use-notify (not
auto-revert-notify-watch-descriptor)) (progn
(auto-revert-notify-add-watch))) (auto-revert-handler))))
(auto-revert-remove-current-buffer)))
  (let ((buf (car bufs))) (save-current-buffer (set-buffer buf) (if
(buffer-live-p buf) (progn (if (and (not auto-revert-mode) (not
auto-revert-tail-mode) (memq buf auto-revert-buffer-list))
(auto-revert-remove-current-buffer)) (if (auto-revert-active-p) (progn
(if (and auto-revert-use-notify ...) (progn ...))
(auto-revert-handler)))) (auto-revert-remove-current-buffer))))
  (while (and bufs (not (and auto-revert-stop-on-user-input
(input-pending-p)))) (let ((buf (car bufs))) (save-current-buffer
(set-buffer buf) (if (buffer-live-p buf) (progn (if (and (not
auto-revert-mode) (not auto-revert-tail-mode) (memq buf
auto-revert-buffer-list)) (auto-revert-remove-current-buffer)) (if
(auto-revert-active-p) (progn (if ... ...) (auto-revert-handler))))
(auto-revert-remove-current-buffer)))) (setq bufs (cdr bufs)))
  (let ((bufs (if global-auto-revert-mode (buffer-list)
auto-revert-buffer-list)) remaining new) (setq bufs (delq nil (mapcar
#'(lambda (buf) (save-current-buffer (set-buffer buf) (and ... buf)))
bufs))) (let ((--dolist-tail-- auto-revert-remaining-buffers)) (while
--dolist-tail-- (let ((buf (car --dolist-tail--))) (if (memq buf bufs)
(setq remaining (cons buf remaining))) (setq --dolist-tail-- (cdr
--dolist-tail--))))) (let ((--dolist-tail-- bufs)) (while
--dolist-tail-- (let ((buf (car --dolist-tail--))) (if (not (memq buf
remaining)) (setq new (cons buf new))) (setq --dolist-tail-- (cdr
--dolist-tail--))))) (setq bufs (nreverse (nconc new remaining)))
(while (and bufs (not (and auto-revert-stop-on-user-input
(input-pending-p)))) (let ((buf (car bufs))) (save-current-buffer
(set-buffer buf) (if (buffer-live-p buf) (progn (if (and ... ... ...)
(auto-revert-remove-current-buffer)) (if (auto-revert-active-p) (progn
... ...))) (auto-revert-remove-current-buffer)))) (setq bufs (cdr
bufs))) (setq auto-revert-remaining-buffers bufs) (if (and (not
global-auto-revert-mode) (null auto-revert-buffer-list)) (progn (if
(timerp auto-revert-timer) (cancel-timer auto-revert-timer)) (setq
auto-revert-timer nil))))
  (progn (let ((bufs (if global-auto-revert-mode (buffer-list)
auto-revert-buffer-list)) remaining new) (setq bufs (delq nil (mapcar
#'(lambda (buf) (save-current-buffer ... ...)) bufs))) (let
((--dolist-tail-- auto-revert-remaining-buffers)) (while
--dolist-tail-- (let ((buf (car --dolist-tail--))) (if (memq buf bufs)
(setq remaining (cons buf remaining))) (setq --dolist-tail-- (cdr
--dolist-tail--))))) (let ((--dolist-tail-- bufs)) (while
--dolist-tail-- (let ((buf (car --dolist-tail--))) (if (not (memq buf
remaining)) (setq new (cons buf new))) (setq --dolist-tail-- (cdr
--dolist-tail--))))) (setq bufs (nreverse (nconc new remaining)))
(while (and bufs (not (and auto-revert-stop-on-user-input
(input-pending-p)))) (let ((buf (car bufs))) (save-current-buffer
(set-buffer buf) (if (buffer-live-p buf) (progn (if ... ...) (if ...
...)) (auto-revert-remove-current-buffer)))) (setq bufs (cdr bufs)))
(setq auto-revert-remaining-buffers bufs) (if (and (not
global-auto-revert-mode) (null auto-revert-buffer-list)) (progn (if
(timerp auto-revert-timer) (cancel-timer auto-revert-timer)) (setq
auto-revert-timer nil)))))
  (unwind-protect (progn (let ((bufs (if global-auto-revert-mode
(buffer-list) auto-revert-buffer-list)) remaining new) (setq bufs
(delq nil (mapcar #'(lambda ... ...) bufs))) (let ((--dolist-tail--
auto-revert-remaining-buffers)) (while --dolist-tail-- (let ((buf
...)) (if (memq buf bufs) (setq remaining ...)) (setq --dolist-tail--
(cdr --dolist-tail--))))) (let ((--dolist-tail-- bufs)) (while
--dolist-tail-- (let ((buf ...)) (if (not ...) (setq new ...)) (setq
--dolist-tail-- (cdr --dolist-tail--))))) (setq bufs (nreverse (nconc
new remaining))) (while (and bufs (not (and
auto-revert-stop-on-user-input (input-pending-p)))) (let ((buf (car
bufs))) (save-current-buffer (set-buffer buf) (if (buffer-live-p buf)
(progn ... ...) (auto-revert-remove-current-buffer)))) (setq bufs (cdr
bufs))) (setq auto-revert-remaining-buffers bufs) (if (and (not
global-auto-revert-mode) (null auto-revert-buffer-list)) (progn (if
(timerp auto-revert-timer) (cancel-timer auto-revert-timer)) (setq
auto-revert-timer nil))))) (set-match-data save-match-data-internal
'evaporate))
  (let ((save-match-data-internal (match-data))) (unwind-protect
(progn (let ((bufs (if global-auto-revert-mode (buffer-list)
auto-revert-buffer-list)) remaining new) (setq bufs (delq nil (mapcar
#'... bufs))) (let ((--dolist-tail-- auto-revert-remaining-buffers))
(while --dolist-tail-- (let (...) (if ... ...) (setq --dolist-tail--
...)))) (let ((--dolist-tail-- bufs)) (while --dolist-tail-- (let
(...) (if ... ...) (setq --dolist-tail-- ...)))) (setq bufs (nreverse
(nconc new remaining))) (while (and bufs (not (and
auto-revert-stop-on-user-input ...))) (let ((buf ...))
(save-current-buffer (set-buffer buf) (if ... ... ...))) (setq bufs
(cdr bufs))) (setq auto-revert-remaining-buffers bufs) (if (and (not
global-auto-revert-mode) (null auto-revert-buffer-list)) (progn (if
(timerp auto-revert-timer) (cancel-timer auto-revert-timer)) (setq
auto-revert-timer nil))))) (set-match-data save-match-data-internal
'evaporate)))
  (closure (t) nil "Revert buffers as specified by Auto-Revert and
Glo..." (setq auto-revert-buffers-counter (1+
auto-revert-buffers-counter)) (let ((save-match-data-internal
(match-data))) (unwind-protect (progn (let ((bufs (if
global-auto-revert-mode ... auto-revert-buffer-list)) remaining new)
(setq bufs (delq nil (mapcar ... bufs))) (let ((--dolist-tail--
auto-revert-remaining-buffers)) (while --dolist-tail-- (let ... ...
...))) (let ((--dolist-tail-- bufs)) (while --dolist-tail-- (let ...
... ...))) (setq bufs (nreverse (nconc new remaining))) (while (and
bufs (not ...)) (let (...) (save-current-buffer ... ...)) (setq bufs
(cdr bufs))) (setq auto-revert-remaining-buffers bufs) (if (and (not
global-auto-revert-mode) (null auto-revert-buffer-list)) (progn (if
... ...) (setq auto-revert-timer nil))))) (set-match-data
save-match-data-internal 'evaporate))))()
  apply((closure (t) nil "Revert buffers as specified by Auto-Revert
and Glo..." (setq auto-revert-buffers-counter (1+
auto-revert-buffers-counter)) (let ((save-match-data-internal
(match-data))) (unwind-protect (progn (let ((bufs ...) remaining new)
(setq bufs (delq nil ...)) (let (...) (while --dolist-tail-- ...))
(let (...) (while --dolist-tail-- ...)) (setq bufs (nreverse ...))
(while (and bufs ...) (let ... ...) (setq bufs ...)) (setq
auto-revert-remaining-buffers bufs) (if (and ... ...) (progn ...
...)))) (set-match-data save-match-data-internal 'evaporate)))) nil)
  auto-revert-buffers()
  magit-auto-revert-buffers()
  magit-refresh()
  magit-update-index()
  (save-current-buffer (set-buffer ediff-buffer-B) (magit-update-index))
  (with-current-buffer ediff-buffer-B (magit-update-index))
  (and (buffer-live-p ediff-buffer-B) (buffer-modified-p
ediff-buffer-B) (with-current-buffer ediff-buffer-B
(magit-update-index)))
  (lambda nil (and (buffer-live-p ediff-buffer-B) (buffer-modified-p
ediff-buffer-B) (with-current-buffer ediff-buffer-B
(magit-update-index))) (and (buffer-live-p ediff-buffer-C)
(buffer-modified-p ediff-buffer-C) (with-current-buffer ediff-buffer-C
(when (y-or-n-p (format "Save file %s? " buffer-file-name))
(save-buffer)))) (ediff-kill-buffer-carefully ediff-buffer-A)
(ediff-kill-buffer-carefully ediff-buffer-B) (let
((magit-ediff-previous-winconf #<window-configuration>)) (run-hooks
'magit-ediff-quit-hook)))()
  run-hooks(ediff-quit-hook)
  ediff-really-quit(nil)
  ediff-quit(nil)
  funcall-interactively(ediff-quit nil)
  call-interactively(ediff-quit nil nil)
  command-execute(ediff-quit)
~~~~~~

I have global-auto-revert-mode on.  I *suspect* this happens because
*something* kills a buffer between when auto-revert-buffers collects
the list of buffers with (buffer-list) and when auto-revert-buffers
starts its final traversal of buffers in bufs (which starts out as
(buffer-list) in global-auto-revert-mode).

Around line 795 inside auto-revert-buffers, the code is:

          (with-current-buffer buf
            (if (buffer-live-p buf)
                ...
              ;; Remove dead buffer from `auto-revert-buffer-list'.
              (auto-revert-remove-current-buffer)))

It seems like reversing this so that with-current-buffer is only
called after buffer-live-p is checked might be a good solution to
avoid trying to select a deleted buffer?

Reproducing this is random for me but many times a day recently.
Alternatively, here is a contrived recipe to reproduce this error, but
*not* using global-auto-revert-mode, instead purposely putting a dead
buffer in auto-revert-buffer-list.  I think it still hits the same
code path inside auto-revert-buffers.

~~~~~~
(require 'autorevert)
(let ((buf (generate-new-buffer "foo")))
  (push buf auto-revert-buffer-list)
  (kill-buffer buf)
  (auto-revert-buffers))
~~~~~~

Regards,
Dale


In GNU Emacs 27.0.50 (build 1, x86_64-apple-darwin17.7.0, NS
appkit-1561.60 Version 10.13.6 (Build 17G5019))
 of 2019-03-12 built on dale
Repository revision: e2b261b66c8352fb07631a89de6c361fdb9e31b8
Repository branch: master
Windowing system distributor 'Apple', version 10.3.1561
System Description:  Mac OS X 10.13.6

Recent messages:
[2019-03-13 12:43:09.484731]  [2 times]
[2019-03-13 12:43:12.296602] Mark set [2 times]
[2019-03-13 12:43:13.170098] Saved text until " nil nil)
  command-execute(ediff-quit)
"
[2019-03-13 12:43:17.822853] Continuing.
imenu-unavailable-error: Selecting deleted buffer
[2019-03-13 12:43:19.929933] Quit this Ediff session? (y or n) y
[2019-03-13 12:43:30.317398]  [2 times]
[2019-03-13 12:43:30.318205] ‘report-emacs-bug-info’ is an obsolete
command (as of 24.3); use ‘info-emacs-bug’ instead.

Configured using:
 'configure --with-ns --with-modules --with-rsvg --with-imagemagick
 --with-xml2 --with-gnutls --with-json --without-x'

Configured features:
RSVG IMAGEMAGICK GLIB NOTIFY KQUEUE ACL GNUTLS LIBXML2 ZLIB
TOOLKIT_SCROLL_BARS XIM NS MODULES THREADS JSON PDUMPER LCMS2

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Magit

Minor modes in effect:
  global-magit-file-mode: t
  magit-auto-revert-mode: t
  global-git-commit-mode: t
  async-bytecomp-package-mode: t
  which-function-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  winum-mode: t
  winner-mode: t
  imenu-list-minor-mode: t
  purpose-mode: t
  volatile-highlights-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  company-statistics-mode: t
  show-paren-mode: t
  sticky-region-mode: t
  save-place-mode: t
  recentf-mode: t
  counsel-projectile-mode: t
  projectile-mode: t
  persp-mode: t
  shell-dirtrack-mode: t
  minions-mode: t
  global-hl-todo-mode: t
  global-hi-lock-mode: t
  hi-lock-mode: t
  flycheck-pos-tip-mode: t
  global-flycheck-mode: t
  auto-frame-resize-mode: t
  global-edit-server-edit-mode: t
  dtrt-indent-global-mode: t
  global-diff-hl-mode: t
  counsel-mode: t
  ivy-mode: t
  delete-selection-mode: t
  clean-aindent-mode: t
  carousel-mode: t
  global-auto-revert-mode: t
  el-patch-use-package-mode: t
  which-key-mode: t
  override-global-mode: t
  auto-compile-on-load-mode: t
  auto-compile-on-save-mode: t
  tooltip-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
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
/Users/dale/.emacs.d/lisp/info-xref hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/info-xref
/Users/dale/.emacs.d/elpa/python-20181115.1504/python hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/progmodes/python
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-stan hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-stan
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-exp hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-exp
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-J hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-J
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-eshell hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-eshell
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-emacs-lisp
hides /Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-emacs-lisp
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-gnus hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-gnus
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-css hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-css
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-lob hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-lob
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-forth hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-forth
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-macs hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-macs
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-version hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-version
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-scheme hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-scheme
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-abc hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-abc
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-C hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-C
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-capture hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-capture
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-ref hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-ref
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-clojure hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-clojure
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-mouse hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-mouse
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-ledger hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-ledger
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-ctags hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-ctags
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-entities hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-entities
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-archive hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-archive
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-screen hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-screen
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-haskell hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-haskell
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-asymptote hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-asymptote
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-mhe hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-mhe
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-table hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-table
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-org hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-org
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-plot hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-plot
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-awk hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-awk
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-groovy hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-groovy
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-octave hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-octave
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-faces hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-faces
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-colview hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-colview
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-R hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-R
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-timer hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-timer
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-ebnf hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-ebnf
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-mobile hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-mobile
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-fortran hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-fortran
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-shell hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-shell
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-perl hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-perl
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-sqlite hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-sqlite
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-sed hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-sed
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-list hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-list
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-ruby hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-ruby
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-eval hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-eval
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-habit hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-habit
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-clock hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-clock
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-html hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-html
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-src hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-src
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-lisp hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-lisp
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-ditaa hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-ditaa
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-pcomplete
hides /Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-pcomplete
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-lint hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-lint
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-rmail hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-rmail
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-latex hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-latex
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-sass hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-sass
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-io hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-io
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-tangle hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-tangle
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-calc hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-calc
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-java hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-java
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-icalendar hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-icalendar
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-eww hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-eww
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-md hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-md
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-beamer hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-beamer
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-element hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-element
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-protocol hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-protocol
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-mscgen hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-mscgen
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-gnuplot hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-gnuplot
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-latex hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-latex
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-id hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-id
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-vala hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-vala
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-man hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-man
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-feed hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-feed
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-lua hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-lua
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-table hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-table
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-ocaml hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-ocaml
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-coq hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-coq
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-picolisp hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-picolisp
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-indent hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-indent
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-lilypond hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-lilypond
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-matlab hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-matlab
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-datetree hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-datetree
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-python hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-python
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-bbdb hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-bbdb
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-makefile hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-makefile
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-duration hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-duration
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-agenda hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-agenda
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-dot hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-dot
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-js hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-js
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-publish hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-publish
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-inlinetask
hides /Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-inlinetask
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-org hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-org
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-core hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-core
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-compat hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-compat
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-docview hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-docview
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-odt hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-odt
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-plantuml hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-plantuml
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-ascii hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-ascii
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-loaddefs hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-loaddefs
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-w3m hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-w3m
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-bibtex hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-bibtex
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-info hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-info
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-hledger hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-hledger
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-maxima hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-maxima
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-macro hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-macro
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-sql hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-sql
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-attach hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-attach
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-processing
hides /Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-processing
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ox-texinfo hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ox-texinfo
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-irc hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-irc
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-crypt hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-crypt
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-footnote hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-footnote
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/org-install hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/org-install
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-comint hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-comint
/Users/dale/.emacs.d/elpa/org-plus-contrib-20190306/ob-shen hides
/Users/dale/Applications/Emacs.app/Contents/Resources/lisp/org/ob-shen

Features:
(shadow sort mail-extr emacsbug sendmail two-column iso-transl dired-aux
counsel-advice-remove ace-window disp-table conf-mode comment-dwim-2
warnings macrostep ivy-xref counsel-auto-grep disass vc-annotate
pkg-info epl pyvenv esh-var esh-cmd esh-opt esh-io esh-ext esh-proc
esh-arg esh-groups eshell esh-module esh-mode esh-util mc-mark-more
multiple-cursors-core rect hl-line+ hl-line hideshow company-anaconda
face-remap markdown-mode edit-indirect deft pulse misearch multi-isearch
debug backtrace link-hint browse-url avy bs magit-imenu git-rebase
magit-ediff ediff-merg ediff-wind ediff-diff ediff-mult ediff-help
ediff-init ediff-util ediff unfill bug-reference adaptive-wrap
magit-extras magit-bookmark magit-submodule magit-obsolete magit-blame
magit-stash magit-bisect magit-push magit-pull magit-fetch magit-clone
magit-remote magit-commit magit-sequence magit-notes magit-worktree
magit-tag magit-merge magit-branch magit-reset magit-files magit-refs
magit-status magit magit-repos magit-apply magit-wip magit-log
magit-diff smerge-mode magit-core magit-autorevert magit-margin
magit-transient magit-process magit-mode transient git-commit magit-git
magit-section magit-utils crm log-edit pcvs-util with-editor
async-bytecomp async eieio-opt speedbar sb-image ezimage dframe
cl-indent mwim cl-print ielm amx url-cache url-http url-gw url-auth
add-log frameset org-duration org-table org-eldoc org-indent eltu
anaconda-mode url url-proxy url-privacy url-expand url-methods
url-history url-cookie url-domsuf url-util mailcap pythonic
network-stream nsm importmagic f s epc ctable concurrent deferred
python-el-fgallina-expansions python tramp-sh tramp tramp-loaddefs
trampver tramp-integration tramp-compat which-func persistent-soft
list-utils pcache eieio-base font-utils haskell-snippets
yasnippet-snippets yasnippet winum winner window-purpose-x imenu-list
ivy-switch-with-purpose window-purpose window-purpose-fixes
window-purpose-prefix-overload window-purpose-switch let-alist
window-purpose-layout window-purpose-core window-purpose-configuration
eieio-compat window-purpose-utils windmove volatile-highlights
all-the-icons all-the-icons-faces data-material data-weathericons
data-octicons data-fileicons data-faicons data-alltheicons memoize
unicode-fonts undo-tree diff paredit aggressive-indent rainbow-mode
whitespace wspc-hydra auto-highlight-symbol company-keywords
company-etags etags fileloop company-gtags company-template
company-dabbrev-code company-dabbrev company-files company-capf
company-statistics company-tng company flyspell ispell goto-addr
highlight-parentheses paren sticky-region server saveplace reformatter
recentf tree-widget counsel-projectile projectile grep ibuf-ext ibuffer
ibuffer-loaddefs persp-mode org-clock ob-shell shell ob-sql ob-python
org-eww org-rmail org-mhe org-irc org-info org-gnus nnir gnus-sum
gnus-group gnus-undo gnus-start gnus-cloud nnimap nnmail mail-source
utf7 netrc nnoo parse-time gnus-spec gnus-int gnus-range message rmc
puny rfc822 mml mml-sec epa epg mailabbrev gmm-utils mailheader gnus-win
gnus nnheader gnus-util rmail rmail-loaddefs mail-utils org-docview
doc-view image-mode org-bibtex bibtex org-bbdb org-w3m org-id org-tempo
tempo cus-edit cus-start cus-load wid-edit org-element avl-tree
generator the-org-mode-expansions org-inset-dblock org ob ob-tangle
ob-ref ob-lob ob-table ob-exp org-macro org-footnote org-src ob-comint
org-pcomplete pcomplete org-list org-faces org-entities time-date
noutline outline org-version ob-emacs-lisp ob-core ob-eval org-keys
org-compat org-macs org-loaddefs format-spec cal-menu calendar
cal-loaddefs move-text minions smart-tabs lisp-comment-dwim hydra lv
hl-todo hi-lock flycheck-pos-tip pos-tip flycheck-package package-lint
imenu finder flycheck frame-resize expand-region text-mode-expansions
er-basic-expansions expand-region-core expand-region-custom edit-server
dtrt-indent diff-hl vc-dir ewoc vc vc-dispatcher counsel xdg xref
project compile comint ansi-color ring swiper ivy flx delsel colir color
ivy-overlay ffap thingatpt clean-aindent-mode carousel bookmark+
bookmark+-key derived dired-x dired dired-loaddefs bookmark+-1
bookmark+-bmu bookmark+-lit bookmark pp autorevert filenotify vc-git
diff-mode elec-pair find-func el-patch exec-path-from-shell which-key
advice paranoid-locals files-x cl-extra bind-key easy-mmode pcase dash
treepy quelpa mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047
rfc2045 mm-util ietf-drums mail-prsvr lisp-mnt help-fns radix-tree
help-mode jka-compr auto-compile packed finder-inf dsedivec-theme
autoloads tex-site edmacro kmacro rx sly-autoloads cl info package
easymenu epg-config url-handlers url-parse auth-source cl-seq eieio
eieio-core cl-macs eieio-loaddefs password-cache json subr-x map
url-vars seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel term/ns-win ns-win ucs-normalize mule-util term/common-win
tool-bar dnd fontset image regexp-opt fringe tabulated-list replace
newcomment text-mode elisp-mode lisp-mode prog-mode register page
menu-bar rfn-eshadow isearch timer select scroll-bar mouse jit-lock
font-lock syntax facemenu font-core term/tty-colors 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 composite charscript charprop
case-table epa-hook jka-cmpr-hook help simple abbrev obarray 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 threads kqueue cocoa ns
lcms2 multi-tty make-network-process emacs)

Memory information:
((conses 16 1534501 263419)
 (symbols 48 54953 55)
 (strings 32 286959 26451)
 (string-bytes 1 8874219)
 (vectors 16 181513)
 (vector-slots 8 4860347 194852)
 (floats 8 1033 1217)
 (intervals 56 125404 6360)
 (buffers 992 151))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sun, 24 Mar 2019 14:32:02 GMT) Full text and rfc822 format available.

Message #8 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: Michael Albinus <michael.albinus <at> gmx.de>
To: Dale Sedivec <dale <at> codefu.org>
Cc: 34847 <at> debbugs.gnu.org
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sun, 24 Mar 2019 15:31:09 +0100
[Message part 1 (text/plain, inline)]
Dale Sedivec <dale <at> codefu.org> writes:

Hi Dale,

Thanks for the report.

> Lately, while in the process of using Magit, I've frequently gotten
> "Selecting deleting buffer" errors.
>
> I have global-auto-revert-mode on.  I *suspect* this happens because
> *something* kills a buffer between when auto-revert-buffers collects
> the list of buffers with (buffer-list) and when auto-revert-buffers
> starts its final traversal of buffers in bufs (which starts out as
> (buffer-list) in global-auto-revert-mode).
>
> Around line 795 inside auto-revert-buffers, the code is:
>
>           (with-current-buffer buf
>             (if (buffer-live-p buf)
>                 ...
>               ;; Remove dead buffer from `auto-revert-buffer-list'.
>               (auto-revert-remove-current-buffer)))
>
> It seems like reversing this so that with-current-buffer is only
> called after buffer-live-p is checked might be a good solution to
> avoid trying to select a deleted buffer?

Something like this. But the final `auto-revert-remove-current-buffer'
needs the buffer to be removed as the current one. So it is a bit more
complex.

I came up with the following patch:

[Message part 2 (text/x-diff, inline)]
*** /tmp/ediffWnT0dx	2019-03-24 15:30:02.022068542 +0100
--- /home/albinus/src/emacs/lisp/autorevert.el	2019-03-24 15:26:41.756960378 +0100
***************
*** 343,352 ****

  ;; Functions:

! (defun auto-revert-remove-current-buffer ()
    "Remove dead buffer from `auto-revert-buffer-list'."
    (setq auto-revert-buffer-list
!         (delq (current-buffer) auto-revert-buffer-list)))

  ;;;###autoload
  (define-minor-mode auto-revert-mode
--- 343,352 ----

  ;; Functions:

! (defun auto-revert-remove-current-buffer (&optional buffer)
    "Remove dead buffer from `auto-revert-buffer-list'."
    (setq auto-revert-buffer-list
!         (delq (or buffer (current-buffer)) auto-revert-buffer-list)))

  ;;;###autoload
  (define-minor-mode auto-revert-mode
***************
*** 772,781 ****
        (setq bufs (delq nil
                         (mapcar
                          (lambda (buf)
!                           (with-current-buffer buf
!                             (and (or (not (file-remote-p default-directory))
!                                      (file-remote-p default-directory nil t))
!                                  buf)))
                          bufs)))
        ;; Partition `bufs' into two halves depending on whether or not
        ;; the buffers are in `auto-revert-remaining-buffers'.  The two
--- 772,783 ----
        (setq bufs (delq nil
                         (mapcar
                          (lambda (buf)
!                           (and (buffer-live-p buf)
!                                (with-current-buffer buf
!                                  (and
!                                   (or (not (file-remote-p default-directory))
!                                       (file-remote-p default-directory nil t))
!                                       buf))))
                          bufs)))
        ;; Partition `bufs' into two halves depending on whether or not
        ;; the buffers are in `auto-revert-remaining-buffers'.  The two
***************
*** 792,815 ****
  		  (not (and auto-revert-stop-on-user-input
  			    (input-pending-p))))
  	(let ((buf (car bufs)))
!           (with-current-buffer buf
!             (if (buffer-live-p buf)
!                 (progn
!                   ;; Test if someone has turned off Auto-Revert Mode
!                   ;; in a non-standard way, for example by changing
!                   ;; major mode.
!                   (if (and (not auto-revert-mode)
!                            (not auto-revert-tail-mode)
!                            (memq buf auto-revert-buffer-list))
!                       (auto-revert-remove-current-buffer))
!                   (when (auto-revert-active-p)
!                     ;; Enable file notification.
!                     (when (and auto-revert-use-notify
!                                (not auto-revert-notify-watch-descriptor))
!                       (auto-revert-notify-add-watch))
!                     (auto-revert-handler)))
                ;; Remove dead buffer from `auto-revert-buffer-list'.
!               (auto-revert-remove-current-buffer))))
  	(setq bufs (cdr bufs)))
        (setq auto-revert-remaining-buffers bufs)
        ;; Check if we should cancel the timer.
--- 794,816 ----
  		  (not (and auto-revert-stop-on-user-input
  			    (input-pending-p))))
  	(let ((buf (car bufs)))
!           (if (not (buffer-live-p buf))
                ;; Remove dead buffer from `auto-revert-buffer-list'.
!               (auto-revert-remove-current-buffer buf)
!             (with-current-buffer buf
!               ;; Test if someone has turned off Auto-Revert Mode
!               ;; in a non-standard way, for example by changing
!               ;; major mode.
!               (if (and (not auto-revert-mode)
!                        (not auto-revert-tail-mode)
!                        (memq buf auto-revert-buffer-list))
!                   (auto-revert-remove-current-buffer))
!               (when (auto-revert-active-p)
!                 ;; Enable file notification.
!                 (when (and auto-revert-use-notify
!                            (not auto-revert-notify-watch-descriptor))
!                   (auto-revert-notify-add-watch))
!                 (auto-revert-handler)))))
  	(setq bufs (cdr bufs)))
        (setq auto-revert-remaining-buffers bufs)
        ;; Check if we should cancel the timer.
[Message part 3 (text/plain, inline)]
> Reproducing this is random for me but many times a day recently.
> Alternatively, here is a contrived recipe to reproduce this error, but
> *not* using global-auto-revert-mode, instead purposely putting a dead
> buffer in auto-revert-buffer-list.  I think it still hits the same
> code path inside auto-revert-buffers.
>
> ~~~~~~
> (require 'autorevert)
> (let ((buf (generate-new-buffer "foo")))
>   (push buf auto-revert-buffer-list)
>   (kill-buffer buf)
>   (auto-revert-buffers))

This recipe fails earlier, in the lambda form checking remote buffers.
I've fixed this case as well.

Could you pls check whether the patch works for you with magit? (I
don't use magit myself)

> Regards,
> Dale

Best regards, Michael.

Added tag(s) patch. Request was from Michael Albinus <michael.albinus <at> gmx.de> to control <at> debbugs.gnu.org. (Sun, 24 Mar 2019 14:32:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Fri, 05 Apr 2019 14:05:02 GMT) Full text and rfc822 format available.

Message #13 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: Tassilo Horn <tsdh <at> gnu.org>
To: Michael Albinus <michael.albinus <at> gmx.de>
Cc: 34847 <at> debbugs.gnu.org, Dale Sedivec <dale <at> codefu.org>
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Fri, 05 Apr 2019 16:03:56 +0200
Michael Albinus <michael.albinus <at> gmx.de> writes:

Hi Michael,

> Thanks for the report.

I had the same issue with autorevert and Magit.  I've used your patch
the whole day and didn't encounter the problem (or a new one) anymore.

Bye,
Tassilo




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 01:56:01 GMT) Full text and rfc822 format available.

Message #16 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
To: Dale Sedivec <dale <at> codefu.org>
Cc: 34847 <at> debbugs.gnu.org
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 02:55:05 +0100
[Message part 1 (text/plain, inline)]
Dale Sedivec <dale <at> codefu.org> writes:

> Lately, while in the process of using Magit, I've frequently gotten
> "Selecting deleting buffer" errors.

Same here.

> I have global-auto-revert-mode on.  I *suspect* this happens because
> *something* kills a buffer between when auto-revert-buffers collects
> the list of buffers with (buffer-list) and when auto-revert-buffers
> starts its final traversal of buffers in bufs (which starts out as
> (buffer-list) in global-auto-revert-mode).

My case is slightly different.  I enable auto-revert-mode neither
locally nor globally, so Magit automatically enables
magit-auto-revert-mode instead.

This means that the killed buffers causing the auto-revert-buffers timer
to choke are present in auto-revert-buffer-list, rather than
(buffer-list).

Normally, killed buffers are removed from auto-revert-buffer-list thanks
to the local kill-buffer-hook function
auto-revert-remove-current-buffer.

But instrumenting get-buffer-create and kill-buffer revealed that
kill-buffer-hook wasn't run sometimes, specifically when an
uninitialised inhibit_buffer_hooks happened to be non-zero.

Eli, is the following TRT?

[0001-Don-t-leave-inhibit_buffer_hooks-uninitialized.patch (text/x-diff, inline)]
From 3c519bd52911db44bb3f92dcc722812d8d69a2c6 Mon Sep 17 00:00:00 2001
From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
Date: Sat, 6 Apr 2019 02:41:16 +0100
Subject: [PATCH] Don't leave inhibit_buffer_hooks uninitialized

* src/buffer.c (Fget_buffer_create): Explicitly initialize
inhibit_buffer_hooks. (bug#34847)
---
 src/buffer.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/buffer.c b/src/buffer.c
index c0f7521c9e..c5d8ee2629 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -588,6 +588,8 @@ even if it is dead.  The return value is never nil.  */)
       && strncmp (SSDATA (name), SSDATA (Vcode_conversion_workbuf_name),
 		  SBYTES (Vcode_conversion_workbuf_name)) == 0)
     b->inhibit_buffer_hooks = true;
+  else
+    b->inhibit_buffer_hooks = false;
 
   bset_undo_list (b, SREF (name, 0) != ' ' ? Qnil : Qt);
 
-- 
2.20.1

[Message part 3 (text/plain, inline)]
Between Michael's patch[1] for autorevert.el and this, I think the issue
should be solved.

[1]: https://debbugs.gnu.org/34847#8

Thanks,

-- 
Basil

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 02:03:02 GMT) Full text and rfc822 format available.

Message #19 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
To: Michael Albinus <michael.albinus <at> gmx.de>
Cc: 34847 <at> debbugs.gnu.org, Dale Sedivec <dale <at> codefu.org>
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 03:02:45 +0100
[Message part 1 (text/plain, inline)]
Michael Albinus <michael.albinus <at> gmx.de> writes:

> Something like this. But the final `auto-revert-remove-current-buffer'
> needs the buffer to be removed as the current one. So it is a bit more
> complex.
>
> I came up with the following patch:
>
> *** /tmp/ediffWnT0dx	2019-03-24 15:30:02.022068542 +0100
> --- /home/albinus/src/emacs/lisp/autorevert.el	2019-03-24 15:26:41.756960378 +0100
> ***************
> *** 343,352 ****
>
>   ;; Functions:
>
> ! (defun auto-revert-remove-current-buffer ()
>     "Remove dead buffer from `auto-revert-buffer-list'."
>     (setq auto-revert-buffer-list
> !         (delq (current-buffer) auto-revert-buffer-list)))
>
>   ;;;###autoload
>   (define-minor-mode auto-revert-mode
> --- 343,352 ----
>
>   ;; Functions:
>
> ! (defun auto-revert-remove-current-buffer (&optional buffer)
>     "Remove dead buffer from `auto-revert-buffer-list'."
>     (setq auto-revert-buffer-list
> !         (delq (or buffer (current-buffer)) auto-revert-buffer-list)))
>
>   ;;;###autoload
>   (define-minor-mode auto-revert-mode

Can you please update the docstring?  E.g.

  "Remove BUFFER from `auto-revert-buffer-list'.
BUFFER defaults to `current-buffer'."

> ***************
> *** 772,781 ****
>         (setq bufs (delq nil
>                          (mapcar
>                           (lambda (buf)
> !                           (with-current-buffer buf
> !                             (and (or (not (file-remote-p default-directory))
> !                                      (file-remote-p default-directory nil t))
> !                                  buf)))
>                           bufs)))
>         ;; Partition `bufs' into two halves depending on whether or not
>         ;; the buffers are in `auto-revert-remaining-buffers'.  The two
> --- 772,783 ----
>         (setq bufs (delq nil
>                          (mapcar
>                           (lambda (buf)
> !                           (and (buffer-live-p buf)
> !                                (with-current-buffer buf
> !                                  (and
> !                                   (or (not (file-remote-p default-directory))
> !                                       (file-remote-p default-directory nil t))
> !                                       buf))))
>                           bufs)))
>         ;; Partition `bufs' into two halves depending on whether or not
>         ;; the buffers are in `auto-revert-remaining-buffers'.  The
>   two

Indentation seems a bit off here.  Note that you can use 'when' instead
of 'and' to fit more easily within 80 columns, if you prefer.

Otherwise LGTM.  Can you please also make the following change while
you're at it?

[autorevert.diff (text/x-diff, inline)]
diff --git a/lisp/autorevert.el b/lisp/autorevert.el
index bc7c616ecb..d736f0d31c 100644
--- a/lisp/autorevert.el
+++ b/lisp/autorevert.el
@@ -509,7 +509,7 @@ auto-revert-notify-rm-watch
 	   (ignore-errors
 	     (file-notify-rm-watch auto-revert-notify-watch-descriptor)))))
      auto-revert-notify-watch-descriptor-hash-list)
-    (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch))
+    (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t))
   (setq auto-revert-notify-watch-descriptor nil
 	auto-revert-notify-modified-p nil))
 
[Message part 3 (text/plain, inline)]
It seems to have been left over from a past change:

* lisp/autorevert.el: Use lexical-binding.  Fix hook usage.
  2015-05-22 00:03:12 -0400
  https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=9e41e0bc6a6fdb7a01841db62d8de42d67be534a

> Could you pls check whether the patch works for you with magit? (I
> don't use magit myself)

Works for me; I hope to see it land soon.  See also my other message for
a related but more subtle problem: https://debbugs.gnu.org/34847#16

Thanks,

-- 
Basil

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 06:40:02 GMT) Full text and rfc822 format available.

Message #22 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: "Basil L. Contovounesios" <contovob <at> tcd.ie>
Cc: 34847 <at> debbugs.gnu.org, dale <at> codefu.org
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 09:39:15 +0300
> From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
> Date: Sat, 06 Apr 2019 02:55:05 +0100
> Cc: 34847 <at> debbugs.gnu.org
> 
> But instrumenting get-buffer-create and kill-buffer revealed that
> kill-buffer-hook wasn't run sometimes, specifically when an
> uninitialised inhibit_buffer_hooks happened to be non-zero.
> 
> Eli, is the following TRT?

Yes.  Sorry, for some reason I assumed that the entire buffer struct
is zeroed when a buffer is allocated, but I see now that was based on
some dream, not on facts.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 09:08:02 GMT) Full text and rfc822 format available.

Message #25 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: Michael Albinus <michael.albinus <at> gmx.de>
To: Tassilo Horn <tsdh <at> gnu.org>
Cc: 34847 <at> debbugs.gnu.org, Dale Sedivec <dale <at> codefu.org>
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 11:07:33 +0200
Tassilo Horn <tsdh <at> gnu.org> writes:

> Hi Michael,

Hi Thassilo,

> I had the same issue with autorevert and Magit.  I've used your patch
> the whole day and didn't encounter the problem (or a new one) anymore.

Thanks for the feedback. I'll push the patch, and I'll close the bug.

> Bye,
> Tassilo

Best regards, Michael.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 09:38:02 GMT) Full text and rfc822 format available.

Message #28 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: Michael Albinus <michael.albinus <at> gmx.de>
To: "Basil L. Contovounesios" <contovob <at> tcd.ie>
Cc: 34847 <at> debbugs.gnu.org, Dale Sedivec <dale <at> codefu.org>
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 11:37:38 +0200
"Basil L. Contovounesios" <contovob <at> tcd.ie> writes:

Hi Basil,

>> ! (defun auto-revert-remove-current-buffer (&optional buffer)
>>     "Remove dead buffer from `auto-revert-buffer-list'."
>
> Can you please update the docstring?  E.g.
>
>   "Remove BUFFER from `auto-revert-buffer-list'.
> BUFFER defaults to `current-buffer'."

Done.

>> --- 772,783 ----
>>         (setq bufs (delq nil
>>                          (mapcar
>>                           (lambda (buf)
>> !                           (and (buffer-live-p buf)
>> !                                (with-current-buffer buf
>> !                                  (and
>> !                                   (or (not (file-remote-p default-directory))
>> !                                       (file-remote-p default-directory nil t))
>> !                                       buf))))
>>                           bufs)))
>>         ;; Partition `bufs' into two halves depending on whether or not
>>         ;; the buffers are in `auto-revert-remaining-buffers'.  The
>>   two
>
> Indentation seems a bit off here.  Note that you can use 'when' instead
> of 'and' to fit more easily within 80 columns, if you prefer.

I'd like to keep it, for simpler diffs when time comes. There's no
problem with the 80 columns width.

> Otherwise LGTM.  Can you please also make the following change while
> you're at it?
>
> diff --git a/lisp/autorevert.el b/lisp/autorevert.el
> index bc7c616ecb..d736f0d31c 100644
> --- a/lisp/autorevert.el
> +++ b/lisp/autorevert.el
> @@ -509,7 +509,7 @@ auto-revert-notify-rm-watch
>  	   (ignore-errors
>  	     (file-notify-rm-watch auto-revert-notify-watch-descriptor)))))
>       auto-revert-notify-watch-descriptor-hash-list)
> -    (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch))
> +    (remove-hook 'kill-buffer-hook #'auto-revert-notify-rm-watch t))
>    (setq auto-revert-notify-watch-descriptor nil
>  	auto-revert-notify-modified-p nil))

Good catch! I've applied it.

> Works for me; I hope to see it land soon.  See also my other message for
> a related but more subtle problem: https://debbugs.gnu.org/34847#16

Eli has already confirmed your approach, so you might commit it (and
close the bug then).

> Thanks,

Best regards, Michael.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 13:40:02 GMT) Full text and rfc822 format available.

Message #31 received at 34847 <at> debbugs.gnu.org (full text, mbox):

From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 34847 <at> debbugs.gnu.org, dale <at> codefu.org
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 14:39:47 +0100
Eli Zaretskii <eliz <at> gnu.org> writes:

>> From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
>> Date: Sat, 06 Apr 2019 02:55:05 +0100
>> Cc: 34847 <at> debbugs.gnu.org
>> 
>> But instrumenting get-buffer-create and kill-buffer revealed that
>> kill-buffer-hook wasn't run sometimes, specifically when an
>> uninitialised inhibit_buffer_hooks happened to be non-zero.
>> 
>> Eli, is the following TRT?
>
> Yes.  Sorry, for some reason I assumed that the entire buffer struct
> is zeroed when a buffer is allocated, but I see now that was based on
> some dream, not on facts.

I was worried some magic like that might be happening somewhere,
but luckily reality is simpler than dreams in this case. ;)

Thanks,

-- 
Basil




Added tag(s) fixed. Request was from "Basil L. Contovounesios" <contovob <at> tcd.ie> to control <at> debbugs.gnu.org. (Sat, 06 Apr 2019 13:43:02 GMT) Full text and rfc822 format available.

bug closed, send any further explanations to 34847 <at> debbugs.gnu.org and Dale Sedivec <dale <at> codefu.org> Request was from "Basil L. Contovounesios" <contovob <at> tcd.ie> to control <at> debbugs.gnu.org. (Sat, 06 Apr 2019 13:43:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#34847; Package emacs. (Sat, 06 Apr 2019 13:43:02 GMT) Full text and rfc822 format available.

Message #38 received at 34847-done <at> debbugs.gnu.org (full text, mbox):

From: "Basil L. Contovounesios" <contovob <at> tcd.ie>
To: Michael Albinus <michael.albinus <at> gmx.de>
Cc: 34847-done <at> debbugs.gnu.org, Dale Sedivec <dale <at> codefu.org>
Subject: Re: bug#34847: 27.0.50;
 auto-revert-buffers occasionally selects a killed buffer
Date: Sat, 06 Apr 2019 14:42:34 +0100
tags 34847 fixed
close 34847
quit

Michael Albinus <michael.albinus <at> gmx.de> writes:

> "Basil L. Contovounesios" <contovob <at> tcd.ie> writes:
>
>> Works for me; I hope to see it land soon.  See also my other message for
>> a related but more subtle problem: https://debbugs.gnu.org/34847#16
>
> Eli has already confirmed your approach, so you might commit it (and
> close the bug then).

Pushed to master and closing this bug.

Thanks,

-- 
Basil




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sun, 05 May 2019 11:24:04 GMT) Full text and rfc822 format available.

bug unarchived. Request was from Michael Albinus <michael.albinus <at> gmx.de> to control <at> debbugs.gnu.org. (Thu, 16 May 2019 13:18:01 GMT) Full text and rfc822 format available.

Forcibly Merged 34847 35755. Request was from Michael Albinus <michael.albinus <at> gmx.de> to control <at> debbugs.gnu.org. (Thu, 16 May 2019 13:19:01 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 14 Jun 2019 11:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 4 years and 307 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.