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