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.
This commit is contained in:
parent
6b631f490a
commit
773c186914
3 changed files with 11 additions and 9 deletions
|
@ -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,
|
||||
|
|
13
src/xdisp.c
13
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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue