From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Derek Upham Newsgroups: gmane.emacs.devel Subject: read_char() does not detect, handle special-event-map buffer changes Date: Mon, 04 Feb 2013 00:36:26 -0800 Message-ID: <87r4kwjx11.fsf@priss.frightenedpiglet.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1359966996 23969 80.91.229.3 (4 Feb 2013 08:36:36 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 4 Feb 2013 08:36:36 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Feb 04 09:36:56 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1U2HXq-0004gL-7Z for ged-emacs-devel@m.gmane.org; Mon, 04 Feb 2013 09:36:54 +0100 Original-Received: from localhost ([::1]:51415 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U2HXX-0002H4-Nn for ged-emacs-devel@m.gmane.org; Mon, 04 Feb 2013 03:36:35 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:58587) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U2HXU-0002Gu-Aw for emacs-devel@gnu.org; Mon, 04 Feb 2013 03:36:34 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U2HXT-00016V-78 for emacs-devel@gnu.org; Mon, 04 Feb 2013 03:36:32 -0500 Original-Received: from smtp61.avvanta.com ([206.124.128.61]:54042 helo=mail.avvanta.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U2HXS-00016Q-Ue for emacs-devel@gnu.org; Mon, 04 Feb 2013 03:36:31 -0500 Original-Received: from mail.avvanta.com (localhost.rowlf.p [127.0.0.1]) by mail.avvanta.com (Postfix) with ESMTP id 7475B93C43 for ; Mon, 4 Feb 2013 00:36:30 -0800 (PST) Original-Received: from priss.frightenedpiglet.com (c-24-16-15-52.hsd1.wa.comcast.net [24.16.15.52]) by mail.avvanta.com (Postfix) with ESMTP id 5D2D793C2E for ; Mon, 4 Feb 2013 00:36:30 -0800 (PST) Original-Received: from localhost ([127.0.0.1] helo=priss.frightenedpiglet.com) by priss with esmtp (Exim 4.80) (envelope-from ) id 1U2HXO-0000C9-4x for emacs-devel@gnu.org; Mon, 04 Feb 2013 00:36:26 -0800 User-agent: mu4e 0.9.9.5-dev6; emacs 24.2.2 X-BlargAV-Status: No viruses detected, BlargAV v1.1 on localhost.scooter.p.blarg.net X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x X-Received-From: 206.124.128.61 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:156817 Archived-At: There is an Emacs package that uses process buffers to communicate with a spawned worker process. Due to locking on underlying files, this limits me to one worker, and hence one Emacs. I'm trying to add D-Bus support to both sides, and have come across a bug in Emacs' support for special events. The package includes a chunk of code that: 1. Brings up a temporary buffer in a visible window. 2. Queries the worker through the process buffer channel. 3. Handles the worker's response in a process filter handler, putting the text into a new buffer and replacing the temporary buffer in the same window. The D-Bus code attempts to do the exact same steps, and appears to succeed. But the first event after displaying the response (usually a keystroke) goes to the /temporary buffer/, generating a "buffer read-only" error. After the error, the command loop resyncs the current buffer to the visible buffer and later events work normally. I ran Emacs 24.2.2 in GDB and found that the read_char() function has code that is supposed to detect this case: if (current_buffer != prev_buffer) { /* The command may have changed the keymaps. Pretend there is input in another keyboard and return. This will recalculate keymaps. */ c = make_number (-2); goto exit; } else goto retry; However, `current_buffer' and `prev_buffer' are showing up as the same in the debugger. I think this is because we haven't gone through a display refresh at this point in the code; the Emacs window still shows the temporary buffer, for example. This specific error case affects D-Bus, but any similar activity by a special event handler should show the same bug. I have a fix that seems to work: remove the test and assume that any special event handler could have changed the keymaps. /* The command may have changed the keymaps. Pretend there is input in another keyboard and return. This will recalculate keymaps. */ c = make_number (-2); goto exit; This removes a potential optimization, as the code goes up to a higher level before restarting `read_char'. But looking at the list of special events (in `special-event-map'), those special events should be infrequent enough that this change won't cause a performance impact. Does anyone know of a reason not to make this change? Thanks, Derek -- Derek Upham sand@blarg.net