emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master c6c16fb: Fix a memory leak in GC of font cache


From: Eli Zaretskii
Subject: [Emacs-diffs] master c6c16fb: Fix a memory leak in GC of font cache
Date: Mon, 09 Nov 2015 16:37:05 +0000

branch: master
commit c6c16fb3f8fe5909baafd53c6b26153dec021064
Author: Dima Kogan <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Fix a memory leak in GC of font cache
    
    * src/alloc.c (compact_font_cache_entry): Don't GC unmarked font
    entities if some of the fonts it references are marked.  This
    plugs a memory leak.  (Bug#21556)
---
 src/alloc.c |   30 +++++++++++++++++++++++++++---
 1 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/alloc.c b/src/alloc.c
index 60751bc..81d644a 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -5328,11 +5328,35 @@ compact_font_cache_entry (Lisp_Object entry)
             are not marked too.  But we must be sure that nothing is
             marked within OBJ before we really drop it.  */
          for (i = 0; i < size; i++)
-           if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i))))
-             break;
+            {
+              Lisp_Object objlist;
+
+              if (VECTOR_MARKED_P (XFONT_ENTITY (AREF (XCDR (obj), i))))
+                break;
+
+              objlist = AREF (AREF (XCDR (obj), i), FONT_OBJLIST_INDEX);
+              for (; CONSP (objlist); objlist = XCDR (objlist))
+                {
+                  Lisp_Object val = XCAR (objlist);
+                  struct font *font = XFONT_OBJECT (val);
+
+                  if (!NILP (AREF (val, FONT_TYPE_INDEX))
+                      && VECTOR_MARKED_P(font))
+                    break;
+                }
+              if (CONSP (objlist))
+               {
+                 /* Foiund a marked font, bail out.  */
+                 break;
+               }
+            }
 
          if (i == size)
-           drop = 1;
+           {
+             /* No marked fonts were found, so this entire font
+                entity can be dropped.  */
+             drop = 1;
+           }
        }
       if (drop)
        *prev = XCDR (tail);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]