Subject: bug#640 closed by Chong Yidong <[email-masked]> (Re: Buffer being killed not current in kill-buffer-hook )

From: [email-masked] (Emacs bug Tracking System)

This is an automatic notification regarding your bug report
which was filed against the emacs package:

#640: Forward: Buffer being killed not current in kill-buffer-hook 

It has been closed by Chong Yidong <[email-masked]>.

Their explanation is attached below along with your original report.
If this explanation is unsatisfactory and you have not received a
better one in a separate message then please contact Chong Yidong <[email-masked]> by
replying to this email.

-- 
640: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=640
Emacs Bug Tracking System
Contact [email-masked] with problems
>From [email-masked] Wed Sep 24 13:13:52 2008
From: Chong Yidong <[email-masked]>
To: Max Mikhanosha <[email-masked]>
Cc: [email-masked]
Subject: Re: Buffer being killed not current in kill-buffer-hook 
Date: Wed, 24 Sep 2008 16:14:17 -0400

> I posted this to emacs-dev, but there was no response. This is still
> happenning to me with latest CVS build.

Sorry for the delay.  I've just checked in a slightly more conservative
version of you patch (since I'm not sure it's correct to apply
save-current-buffer in all situations).  Thanks for the report and the
patch.

>From [email-masked] Fri Aug  1 09:47:07 2008
Date: Fri, 01 Aug 2008 12:22:52 -0400
From: Max Mikhanosha <[email-masked]>
To: [email-masked]
Subject: Forward: Buffer being killed not current in kill-buffer-hook 

--Multipart_Fri_Aug__1_12:22:52_2008-1
Content-Type: text/plain; charset=US-ASCII

I posted this to emacs-dev, but there was no response. This is still
happenning to me with latest CVS build.

--Multipart_Fri_Aug__1_12:22:52_2008-1
Content-Type: message/rfc822

Date: Sat, 19 Jul 2008 16:29:25 -0400
Message-ID: <[email-masked]>
From: Max Mikhanosha <[email-masked]>
To: [email-masked]
Subject: Buffer being killed not current in kill-buffer-hook 
User-Agent: Wanderlust/2.15.3 (Almost Unreal) SEMI/1.14.6 (Maruoka)
 FLIM/1.14.8 (=?ISO-8859-4?Q?Shij=F2?=) APEL/10.6 Emacs/22.0.51
 (x86_64-unknown-linux-gnu) MULE/5.0 (SAKAKI)
MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka")
Content-Type: text/plain; charset=US-ASCII

When using multi-tty emacsclient, the following piece of code demostrates the problem:

DISPLAY is unset, CVS Emacs started with --no-init-file

(require 'server)
(progn (setq server-name "test")
       (server-start))
(defun print-current-buffer ()
  (message "current-buffer=%s" (current-buffer)))
(add-hook 'kill-buffer-hook 'print-current-buffer)

Now from a different screen session, connect with emacsclient like so:
"lib-src/emacsclient -c -s test foo". New tty frame will be created. 
Immeditely kill the buffer, it will ask "Buffer has existing clients"
say "yes". emacsclient will disconnect from a server.

In the *Messages* buffer on the server frame:

When done with a buffer, type C-x #
(No files need saving)
current-buffer=*scratch*

All the code that uses kill-buffer-hook rightfully assumes that the
buffer being killed will be current buffer when called, as that is
what is stated in the kill-buffer-hook documentation. For example
saveplace does not work because of this.. ERC leaves a channel if 
unrelated buffer is killed on a different terminal, etc.

I had fixed this with the following patch, altho I don't know enough
about server.el logic to figure out if what it does is ok? Seems to
have fixed the bug and not broke anything else:

Index: lisp/server.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/server.el,v
retrieving revision 1.166
diff -u -b -r1.166 server.el
--- lisp/server.el	6 May 2008 07:57:49 -0000	1.166
+++ lisp/server.el	19 Jul 2008 20:28:26 -0000
@@ -1084,7 +1084,8 @@
 	  ;; tell it that it is done, and forget it entirely.
 	  (unless buffers
 	    (server-log "Close" proc)
-	    (server-delete-client proc)))))
+            (save-current-buffer 
+              (server-delete-client proc))))))
     (when (and (bufferp buffer) (buffer-name buffer))
       ;; We may or may not kill this buffer;
       ;; if we do, do not call server-buffer-done recursively

--Multipart_Fri_Aug__1_12:22:52_2008-1--