]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve GC+Cairo workaround
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 4 Apr 2018 17:59:09 +0000 (10:59 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 4 Apr 2018 17:59:53 +0000 (10:59 -0700)
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
src/ftcrfont.c
src/ftfont.c

index d88c8eb4f661c9ab86b5945bda9068d26067bb69..469431fee671373161ec3ae2d9b5fe4f1986352e 100644 (file)
@@ -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 */
index 614ef083701790347ba9f1a2042b8ca709342011..425250e2297b3e287a973d1e88192e85554bf124 100644 (file)
@@ -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;
 
index 51b04a86829b47c45a1e9a1eb0555fcad5fd5b99..9a8777ef078a660d7fc4d4e4f7b8815cf78f3245 100644 (file)
@@ -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;