From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: gerd.moellmann@t-online.de (Gerd Moellmann) Newsgroups: gmane.emacs.devel Subject: Re: [spiegel@gnu.org: Re: [Fwd: vc-annotate causes Emacs to die]] Date: 27 Aug 2002 00:02:02 +0200 Sender: emacs-devel-admin@gnu.org Message-ID: <868z2te0th.fsf@gerd.free-bsd.org> References: <200208260036.g7Q0aYe12400@wijiji.santafe.edu> <86n0r9vj6i.fsf@gerd.free-bsd.org> <87znv91n8y.fsf@wesley.springies.com> <86u1lhe5az.fsf@gerd.free-bsd.org> NNTP-Posting-Host: localhost.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: main.gmane.org 1030399674 22088 127.0.0.1 (26 Aug 2002 22:07:54 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Mon, 26 Aug 2002 22:07:54 +0000 (UTC) Cc: rms@gnu.org, emacs-devel@gnu.org, spiegel@gnu.org Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by main.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 17jS1X-0005jz-00 for ; Tue, 27 Aug 2002 00:07:51 +0200 Original-Received: from monty-python.gnu.org ([199.232.76.173]) by quimby.gnus.org with esmtp (Exim 3.12 #1 (Debian)) id 17jSWX-0007sH-00 for ; Tue, 27 Aug 2002 00:39:54 +0200 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 17jS2o-0001F1-00; Mon, 26 Aug 2002 18:09:10 -0400 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17jRwW-0000ce-00 for emacs-devel@gnu.org; Mon, 26 Aug 2002 18:02:40 -0400 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17jRwU-0000cR-00 for emacs-devel@gnu.org; Mon, 26 Aug 2002 18:02:39 -0400 Original-Received: from mailout10.sul.t-online.com ([194.25.134.21]) by monty-python.gnu.org with esmtp (Exim 4.10) id 17jRwQ-0000bt-00; Mon, 26 Aug 2002 18:02:34 -0400 Original-Received: from fwd10.sul.t-online.de by mailout10.sul.t-online.com with smtp id 17jRwJ-0004TN-0C; Tue, 27 Aug 2002 00:02:27 +0200 Original-Received: from gerd.free-bsd.org (520015515780-0001@[217.230.105.241]) by fwd10.sul.t-online.com with esmtp id 17jRwC-1wgGlkC; Tue, 27 Aug 2002 00:02:20 +0200 Original-Received: from gerd.free-bsd.org (localhost [127.0.0.1]) by gerd.free-bsd.org (8.12.5/8.12.5) with ESMTP id g7QM2Iss003240; Tue, 27 Aug 2002 00:02:18 +0200 (CEST) (envelope-from gerd.moellmann@t-online.de) Original-Received: (from gerd@localhost) by gerd.free-bsd.org (8.12.5/8.12.5/Submit) id g7QM22ph003235; Tue, 27 Aug 2002 00:02:02 +0200 (CEST) X-Authentication-Warning: gerd.free-bsd.org: gerd set sender to gerd.moellmann@t-online.de using -f Original-To: Alan Shutko In-Reply-To: <86u1lhe5az.fsf@gerd.free-bsd.org> Original-Lines: 20 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 X-Sender: 520015515780-0001@t-dialin.net Errors-To: emacs-devel-admin@gnu.org X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Emacs development discussions. List-Unsubscribe: , List-Archive: Xref: main.gmane.org gmane.emacs.devel:6942 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:6942 --=-=-= Gerd Moellmann writes: > Until I find time to debug this further, it might be worth using this > quich workaround: [...] I think the real fix could be what's in the attached patch (please install when tested). P.S. Can I now have the 21.2 cursor shapes back, as I requested a couple of times? The new cursor shapes for the off-state of the blinking cursor and in non-selected windows drive me up the wall. Why was that change made, for heaven's sake? --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=d.diff Content-Description: d.diff 2002-08-26 Gerd Moellmann * xdisp.c (redisplay_updating_p): Variable removed. (inhibit_free_realized_faces, Qinhibit_free_realized_faces): New variables. (init_iterator): Don't free realized faces if inhibit_free_realized_faces is set. (redisplay_internal): Bind Qinhibit_free_realized_faces to nil. (syms_of_xdisp): DEFVAR_BOOL inhibit-free-realized-faces, initialize Qinhibit_free_realized_faces. * dispextern.h (PRODUCE_GLYPHS): Set inhibit_free_realized_faces when iterator is adding glyphs to a glyph matrix. Index: dispextern.h =================================================================== RCS file: /cvsroot/emacs/emacs/src/dispextern.h,v retrieving revision 1.137 diff -c -u -r1.137 dispextern.h cvs server: conflicting specifications of output style --- dispextern.h 16 Jul 2002 19:48:08 -0000 1.137 +++ dispextern.h 26 Aug 2002 21:43:53 -0000 @@ -1852,10 +1852,16 @@ /* Call produce_glyphs or produce_glyphs_hook, if set. Shortcut to avoid the function call overhead. */ -#define PRODUCE_GLYPHS(IT) \ - (rif \ - ? rif->produce_glyphs ((IT)) \ - : produce_glyphs ((IT))) +#define PRODUCE_GLYPHS(IT) \ + do { \ + extern int inhibit_free_realized_faces; \ + if (rif != NULL) \ + rif->produce_glyphs ((IT)); \ + else \ + produce_glyphs ((IT)); \ + if ((IT)->glyph_row != NULL) \ + inhibit_free_realized_faces = 1; \ + } while (0) /* Bit-flags indicating what operation move_it_to should perform. */ Index: xdisp.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/xdisp.c,v retrieving revision 1.777 diff -c -u -r1.777 xdisp.c cvs server: conflicting specifications of output style --- xdisp.c 22 Aug 2002 16:52:56 -0000 1.777 +++ xdisp.c 26 Aug 2002 21:45:10 -0000 @@ -706,9 +706,12 @@ int redisplaying_p; -/* Non-zero while redisplay is updating the display. */ +/* Non-zero means don't free realized faces. Bound while freeing + realized faces is dangerous because glyph matrices might still + reference them. */ -int redisplay_updating_p; +int inhibit_free_realized_faces; +Lisp_Object Qinhibit_free_realized_faces; /* Function prototypes. */ @@ -1524,7 +1527,7 @@ free realized faces now because they depend on face definitions that might have changed. Don't free faces while there might be desired matrices pending which reference these faces. */ - if (face_change_count && !redisplay_updating_p) + if (face_change_count && !inhibit_free_realized_faces) { face_change_count = 0; free_all_realized_faces (Qnil); @@ -8514,11 +8517,11 @@ count = SPECPDL_INDEX (); record_unwind_protect (unwind_redisplay, make_number (redisplaying_p)); ++redisplaying_p; + specbind (Qinhibit_free_realized_faces, Qnil); retry: pause = 0; reconsider_clip_changes (w, current_buffer); - redisplay_updating_p = 0; /* If new fonts have been loaded that make a glyph matrix adjustment necessary, do it. */ @@ -9006,9 +9009,8 @@ redisplay_window_error); /* Compare desired and current matrices, perform output. */ - update: - redisplay_updating_p = 1; + update: /* If fonts changed, display again. */ if (fonts_changed_p) goto retry; @@ -9134,7 +9136,6 @@ goto retry; end_of_redisplay: - redisplay_updating_p = 0; unbind_to (count, Qnil); } @@ -9172,14 +9173,13 @@ /* Function registered with record_unwind_protect in redisplay_internal. Reset redisplaying_p to the value it had before redisplay_internal was called, and clear - redisplay_updating_p. */ + prevent_freeing_realized_faces_p. */ static Lisp_Object unwind_redisplay (old_redisplaying_p) Lisp_Object old_redisplaying_p; { redisplaying_p = XFASTINT (old_redisplaying_p); - redisplay_updating_p = 0; return Qnil; } @@ -15299,6 +15299,8 @@ staticpro (&Qobject); Qrisky_local_variable = intern ("risky-local-variable"); staticpro (&Qrisky_local_variable); + Qinhibit_free_realized_faces = intern ("inhibit-free-realized-faces"); + staticpro (&Qinhibit_free_realized_faces); list_of_error = Fcons (intern ("error"), Qnil); staticpro (&list_of_error); @@ -15560,6 +15562,10 @@ DEFVAR_BOOL ("inhibit-eval-during-redisplay", &inhibit_eval_during_redisplay, doc: /* Non-nil means don't eval Lisp during redisplay. */); inhibit_eval_during_redisplay = 0; + + DEFVAR_BOOL ("inhibit-free-realized-faces", &inhibit_free_realized_faces, + doc: /* Non-nil means don't free realized faces. Internal use only. */); + inhibit_free_realized_faces = 0; #if GLYPH_DEBUG DEFVAR_BOOL ("inhibit-try-window-id", &inhibit_try_window_id, --=-=-=--