emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 773c186: Avoid crashes due to clearing of a frame's face cache


From: Eli Zaretskii
Subject: master 773c186: Avoid crashes due to clearing of a frame's face cache
Date: Wed, 15 Sep 2021 09:15:56 -0400 (EDT)

branch: master
commit 773c186914627c6be4ab13fcfa62928675ee94e1
Author: Eli Zaretskii <eliz@gnu.org>
Commit: Eli Zaretskii <eliz@gnu.org>

    Avoid crashes due to clearing of a frame's face cache
    
    * src/xfaces.c (clear_face_cache): Don't clear fonts and faces of
    a frame that is being redisplayed, just because it's time for some
    routine maintenance.  (Bug#50571)
    * src/xdisp.c (redisplay_internal):
    * src/frame.h (struct frame) <inhibit_clear_image_cache>: Update
    commentary of using this struct member.
---
 src/frame.h  |  4 ++--
 src/xdisp.c  | 13 +++++++------
 src/xfaces.c |  3 ++-
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/src/frame.h b/src/frame.h
index a8ad011..3dd7680 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -449,8 +449,8 @@ struct frame
   /* Non-zero if this frame's faces need to be recomputed.  */
   bool_bf face_change : 1;
 
-  /* Non-zero if this frame's image cache cannot be freed because the
-     frame is in the process of being redisplayed.  */
+  /* Non-zero if this frame's image cache and face cache cannot be
+     freed because the frame is in the process of being redisplayed.  */
   bool_bf inhibit_clear_image_cache : 1;
 
   /* True when new_width or new_height were set by change_frame_size,
diff --git a/src/xdisp.c b/src/xdisp.c
index d30a685..2e72f6b 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -16061,12 +16061,13 @@ redisplay_internal (void)
              if (FRAME_VISIBLE_P (f) && !FRAME_OBSCURED_P (f))
                {
 
-                 /* Don't allow freeing images for this frame as long
-                    as the frame's update wasn't completed.  This
-                    prevents crashes when some Lisp that runs from
-                    the various hooks or font-lock decides to clear
-                    the frame's image cache, when the images in that
-                    cache are referenced by the desired matrix.  */
+                 /* Don't allow freeing images and faces for this
+                    frame as long as the frame's update wasn't
+                    completed.  This prevents crashes when some Lisp
+                    that runs from the various hooks or font-lock
+                    decides to clear the frame's image cache and face
+                    cache, when the images and faces in those caches
+                    are referenced by the desired matrix.  */
                  f->inhibit_clear_image_cache = true;
                  redisplay_windows (FRAME_ROOT_WINDOW (f));
                }
diff --git a/src/xfaces.c b/src/xfaces.c
index 2273fb4..aefed54 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -674,7 +674,8 @@ clear_face_cache (bool clear_fonts_p)
        {
          struct frame *f = XFRAME (frame);
          if (FRAME_WINDOW_P (f)
-             && FRAME_DISPLAY_INFO (f)->n_fonts > CLEAR_FONT_TABLE_NFONTS)
+             && FRAME_DISPLAY_INFO (f)->n_fonts > CLEAR_FONT_TABLE_NFONTS
+             && !f->inhibit_clear_image_cache)
            {
              clear_font_cache (f);
              free_all_realized_faces (frame);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]