>From 81f2010c21849e758a53f1d0c58c465146c1efee Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 4 Apr 2018 10:59:09 -0700 Subject: [PATCH] Improve GC+Cairo workaround Suggested by Eli Zaretskii (Bug#20890#31). * src/font.h (font_data_structures_may_be_ill_formed): New function. * src/ftfont.c (ftfont_close): * src/ftcrfont.c (ftcrfont_close): Use it. --- src/font.h | 16 ++++++++++++++++ src/ftcrfont.c | 3 +++ src/ftfont.c | 9 +-------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/font.h b/src/font.h index d88c8eb4f6..469431fee6 100644 --- a/src/font.h +++ b/src/font.h @@ -945,6 +945,22 @@ extern void font_deferred_log (const char *, Lisp_Object, Lisp_Object); font_deferred_log ((ACTION), (ARG), (RESULT)); \ } while (false) +/* FIXME: This is for use in functions that can be called while + garbage-collecting, but which assume that Lisp data structures are + properly-formed. This invalid assumption can lead to core dumps + (Bug#20890). */ +INLINE bool +font_data_structures_may_be_ill_formed (void) +{ +#ifdef USE_CAIRO + /* Although this works around Bug#20890, it is probably not the + right thing to do. */ + return gc_in_progress; +#else + return false; +#endif +} + INLINE_HEADER_END #endif /* not EMACS_FONT_H */ diff --git a/src/ftcrfont.c b/src/ftcrfont.c index 614ef08370..425250e229 100644 --- a/src/ftcrfont.c +++ b/src/ftcrfont.c @@ -164,6 +164,9 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size) static void ftcrfont_close (struct font *font) { + if (font_data_structures_may_be_ill_formed ()) + return; + struct ftcrfont_info *ftcrfont_info = (struct ftcrfont_info *) font; int i; diff --git a/src/ftfont.c b/src/ftfont.c index 51b04a8682..9a8777ef07 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -1242,15 +1242,8 @@ ftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) void ftfont_close (struct font *font) { - /* FIXME: Although this function can be called while garbage-collecting, - the function assumes that Lisp data structures are properly-formed. - This invalid assumption can lead to core dumps (Bug#20890). */ -#ifdef USE_CAIRO - /* Although this works around Bug#20890, it is probably not the - right thing to do. */ - if (gc_in_progress) + if (font_data_structures_may_be_ill_formed ()) return; -#endif struct ftfont_info *ftfont_info = (struct ftfont_info *) font; Lisp_Object val, cache; -- 2.14.3