GNU bug report logs -
#11665
kill-buffer gives an error on killing dead buffers
Previous Next
Reported by: Vitalie Spinu <spinuvit <at> gmail.com>
Date: Sun, 10 Jun 2012 11:01:02 UTC
Severity: normal
Tags: patch
Fixed in version 24.2
Done: martin rudalics <rudalics <at> gmx.at>
Bug is archived. No further changes may be made.
Full log
Message #8 received at 11665 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
> Create a buffer "test.tmp" and create an indirect buffer:
>
> (with-current-buffer (make-indirect-buffer "test.tmp" "test1")
> (add-hook 'kill-buffer-hook
> '(lambda ()
> (setq kill-buffer-hook nil)
> (kill-buffer (buffer-base-buffer)))
> t t))
>
> (The above triggers the killing of the base buffer when an indirect
> buffer is killed)
>
> Now, kill the base buffer "test.tmp", which raises:
>
> signal(error ("Buffer #<killed buffer> is not a live buffer"))
> error("Buffer %s is not a live buffer" #<killed buffer>)
> window-normalize-buffer(#<killed buffer>)
> replace-buffer-in-windows(#<killed buffer>)
> kill-buffer(#<killed buffer>)
> (if (and (boundp (quote sub-kill-buffer-and-its-windows)) sub-kill-buffer-and-its-windows (fboundp (quote kill-buffer-and-its-windows))) (kill-buffer-and-its-windows (current-buffer)) (kill-buffer (current-buffer)))
>
>
> This doesn't occur when killing an indirect buffer.
I don't have `sub-kill-buffer-and-its-windows' so I can't repeat this
easily. Anyway, here's what I suppose to happen:
Killing "test.tmp" implicitly calls `kill-buffer' on "test1" because
killing a base buffer kills all its indirect buffers.
Killing "test1" calls `kill-buffer' on "test.tmp" because that's on
the hook.
Killing "test.tmp" calls `kill-buffer' on "test1" again.
Killing "test1" now succeeds and returns.
Killing "test.tmp" now succeeds.
Killing "test1" now tries to continue with `replace-buffer-in-windows'
but this fails because the buffer is no more live.
I also suppose that the
> kill-buffer(#<killed buffer>)
is a red herring in the sense that `kill-buffer' was actually invoked
with a live buffer but when the trace was printed the buffer was already
dead while `replace-buffer-in-windows' was really called with a dead
buffer as argument.
Basically, I could exit `replace-buffer-in-windows' when the argument
buffer is not live but that's not nice. So maybe the attached patch is
better. Can you try it?
martin
[buffer.c.diff (text/plain, inline)]
*** src/buffer.c 2012-05-29 16:13:38 +0000
--- src/buffer.c 2012-06-10 12:52:57 +0000
***************
*** 1526,1531 ****
--- 1526,1535 ----
UNGCPRO;
}
+ /* If killing the indirect buffers has killed our buffer, return. */
+ if (NILP (BVAR (b, name)))
+ return Qnil;
+
/* Run replace_buffer_in_windows before making another buffer current
since set-window-buffer-start-and-point will refuse to make another
buffer current if the selected window does not show the current
This bug report was last modified 12 years and 347 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.