diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2018-04-04 10:59:09 -0700 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2019-01-05 11:53:04 +0200 |
commit | 99e2ad9e4e5edeb91e739605c15dbf07f31143cc (patch) | |
tree | e9d5314b6e0711fe1ae698c3eda5c90f71175e72 | |
parent | e0862eda47c549850a43f09d12882849a2073f93 (diff) | |
download | emacs-99e2ad9e4e5edeb91e739605c15dbf07f31143cc.tar.gz |
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.
(cherry picked from commit d02fd482fbeaf6ed551e78223b538495cb0c3541)
-rw-r--r-- | src/font.h | 16 | ||||
-rw-r--r-- | src/ftcrfont.c | 3 | ||||
-rw-r--r-- | src/ftfont.c | 9 |
3 files changed, 20 insertions, 8 deletions
diff --git a/src/font.h b/src/font.h index bb468333e85..b6e43b0c9ca 100644 --- a/src/font.h +++ b/src/font.h @@ -948,6 +948,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 0e3490c570e..62f44573a86 100644 --- a/src/ftcrfont.c +++ b/src/ftcrfont.c @@ -165,6 +165,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 bdb1dff8cb9..823fb2095ce 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -1243,15 +1243,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; |