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 d02fd482fb)
This commit is contained in:
Paul Eggert 2018-04-04 10:59:09 -07:00 committed by Eli Zaretskii
parent e0862eda47
commit 99e2ad9e4e
3 changed files with 20 additions and 8 deletions

View file

@ -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 */

View file

@ -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;

View file

@ -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;