Subject: Re: bug#34847: 27.0.50; auto-revert-buffers occasionally selects a killed buffer

From: "Basil L. Contovounesios" <[email-masked]>
Date: Sat, 06 Apr 2019 02:55:05 +0100

Dale Sedivec <[email-masked]> 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?

>From 3c519bd52911db44bb3f92dcc722812d8d69a2c6 Mon Sep 17 00:00:00 2001
From: "Basil L. Contovounesios" <[email-masked]>
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

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