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.
This commit is contained in:
parent
2f779d8ce8
commit
d02fd482fb
3 changed files with 20 additions and 8 deletions
16
src/font.h
16
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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue