[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 1
From: |
Eli Zaretskii |
Subject: |
bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006 |
Date: |
Mon, 02 Dec 2013 19:52:58 +0200 |
> Date: Mon, 02 Dec 2013 14:45:25 +0400
> From: Dmitry Antipov <dmantipov@yandex.ru>
> CC: 15876@debbugs.gnu.org
>
> On 12/01/2013 08:31 PM, Eli Zaretskii wrote:
>
> > Dmitry, can you please look into this? I'm not familiar enough with
> > the font stuff, so I don't see how was the font-spec and its
> > font-entities stored in the font cache supposed to be referenced from
> > some other Lisp object, to make sure they are marked and not GC'ed.
>
> It should be easy - just use this:
>
> === modified file 'src/alloc.c'
> --- src/alloc.c 2013-12-01 22:33:13 +0000
> +++ src/alloc.c 2013-12-02 09:32:55 +0000
> @@ -5731,7 +5731,18 @@
> eassert (!VECTOR_MARKED_P (ptr));
> VECTOR_MARK (ptr); /* Else mark it. */
> if (size & PSEUDOVECTOR_FLAG)
> - size &= PSEUDOVECTOR_SIZE_MASK;
> + {
> + size &= PSEUDOVECTOR_SIZE_MASK;
> + if (PSEUDOVECTOR_TYPEP (&ptr->header, PVEC_FONT))
> + {
> + Lisp_Object tmp;
> + XSETFONT (tmp, ptr);
> + if (FONT_SPEC_P (tmp))
> + fprintf (stderr, "mark font-spec\n");
> + else if (FONT_ENTITY_P (tmp))
> + fprintf (stderr, "mark font-entity\n");
> + }
> + }
>
> and set breakpoints to fprintf(). I tried this and see that font-spec
> objects can be referenced from face caches:
Thanks. But I think I didn't make myself clear: the issue is not just
to see ANY font-spec objects being marked. The issue is with those
font-spec objects that are recorded in the font caches that are
compacted by compact_font_caches. I don't see any code that makes
sure some Lisp object references those caches. Without that, they
cannot be possibly marked, and will be GC'ed, right?
> But the most of font-spec and font-entity objects are referenced via
> staticpro'ed globals Vfontset_table and ft_face_cache.
Those staticpro'ed objects might just be the reason why you don't see
the problem. Your build uses the ftfont driver, doesn't it? Because
ftfont.c has this implementation of the get_cache method:
static Lisp_Object
ftfont_get_cache (struct frame *f)
{
return freetype_font_cache;
}
and freetype_font_cache is a staticpro'ed variable. By contrast,
w32font.c does this:
Lisp_Object
w32font_get_cache (struct frame *f)
{
struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
return (dpyinfo->name_list_element);
}
and dpyinfo->name_list_element is what compact_font_caches examines.
(Note that xfont.c and xftfont.c also use a cache stored in
dpyinfo->name_list_element, so this issue is not entirely Windows
specific.)
> > In any case, it seems like they are never marked on Windows, because
> > if I set a breakpoint in the line marked below:
> >
> > /* If font-spec is not marked, most likely all font-entities
> > 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;
> >
> > if (i == size) <<<<<<<<<<<<<<<<<<<<<
> > drop = 1;
> > }
> >
> > with a condition i != size, that breakpoint never breaks.
>
> The best way to hit this breakpoint is to run something like:
>
> (defun bloat-font ()
> (interactive)
> (let ((fonts (x-list-fonts "*")))
> (while fonts
> (condition-case nil (set-frame-font (car fonts)) (error nil))
> (setq fonts (cdr fonts))
> (redisplay))))
>
> (This is X-specific; I believe there should be a similar MS-Windows method).
What is X-specific here? If you mean x-list-fonts, then it exists on
Windows and does the same.
Anyway, I think we are mis-communicating again: the above Lisp code
will cause the breakpoint to fire with i == size, i.e. we will remove
the font-entities from the cache. I wanted the opposite: to see at
least 1 font-entity that is NOT removed. So my breakpoint condition
was "i != size", which means we will NOT drop the font-entity. What I
saw is that this condition is never true, which means we remove ALL of
the font-entities from the cache.
> Subtle "triangle example" works just fine for me (with default font used by
> GTK3 build and 'emacs -Q' at least).
If the font cache is not cleared, you will not see any problem at all.
> Also I'm curious how to reproduce this issue with X. In particular, how to
> find a font so "heavy" that an attempt to load it creates a lot of Lisp data
> (hundreds Kbytes, enough to reach gc_cons_threshold each time)?
Well, you could lower gc_cons_threshold instead, couldn't you?
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Eli Zaretskii, 2013/12/01
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/02
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/02
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006,
Eli Zaretskii <=
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/03
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Eli Zaretskii, 2013/12/03
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/03
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Eli Zaretskii, 2013/12/04
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/05
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Eli Zaretskii, 2013/12/05
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/11
- bug#15876: [SPAM] bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Jarek Czekalski, 2013/12/11
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Dmitry Antipov, 2013/12/11
- bug#15876: 24.3.50; Highly degraded performance between rev 114715 and 115006, Eli Zaretskii, 2013/12/11