[Fontconfig] FontConfig memory question

Akira TAGOH akira at tagoh.org
Thu Feb 13 03:39:00 CET 2014


Apparently you are missing calling FcFontSetDestroy() for fontset and
FcPatternDestroy() for fpat though, is it done at the out of snippets
right?

Another question is, what pattern are you giving to fontspec? is it
possible to reproduce that issue with fc-match -s perhaps?

On Thu, Feb 13, 2014 at 7:39 AM, mathog <mathog at caltech.edu> wrote:
> He all,
>
> The question concerns the bit of FontConfig using code below (sorry about
> the wrap) which is leaking memory in some mysterious manner, but so far only
> when compiled into Inkscape, and only, apparently, for certain fonts.  (The
> one case where I see this is a test sample containing Hebrew Ezra SIL and
> Ezra SIL SR fonts.)  The code is part of the file text_reassemble.c which is
> from libTERE (on sourceforge) but it is also included in Inkscape.  I have
> traced through this and in every instance "pattern", the pointer to the
> leaking memory, was sent to FcPatternDestroy.  Yet when run in valgrind the
> line where that pointer is attached to memory shows up as a leak.
>
> Any idea what this might be???  I thought that it might have been a case
> where something later on replaces a field in "pattern", but that should have
> given the "definitely lost" message in valgrind, not "still reachable".  The
> only other thing that comes to mind is that FcNameParse itself leaks memory
> internally for certain fontspec's, and this has nothing to do with the
> "pattern" variable in this code.  This is on a Ubuntu 12.04.04 system, with
> fontconfig 2.8.0-3ubuntu9.1 packages.
>
> Here is the code snippet:
>
>    pattern = FcNameParse((const FcChar8 *)fontspec);  //<--- line 750,
> problem is here
>    while(1) {  /* this is NOT a loop, it uses breaks to avoid gotos and deep
> nesting */
>    if(!(pattern)){
> status = -2;   break; }
>       if(!FcConfigSubstitute(NULL, pattern, FcMatchPattern)){
> status = -3;   break; };
>       FcDefaultSubstitute(pattern);
>       /*  get a fontset, trimmed to only those with new glyphs as needed, so
> that missing glyph's may be handled */
>       if(!(fontset = FcFontSort (NULL,pattern, FcTrue, NULL, &result)) ||
> (result != FcResultMatch)){ status = -4;   break; }
>       if(!(fpat = FcFontRenderPrepare(NULL, pattern, fontset->fonts[0]))){
> status = -405; break; }
>       if(FcPatternGetString(  fpat, FC_FILE,   0, (FcChar8 **)&filename)  !=
> FcResultMatch){          status = -5;   break; }
>       if(FcPatternGetDouble(  fpat, FC_SIZE,   0,  &fd)                   !=
> FcResultMatch){          status = -6;   break; }
>
>       /* copy these into memory for external use */
>       fsp                   = &(fti->fonts[fti->used]);
>       fsp->fontset          = fontset;
>       fsp->alts             = NULL;  /* Initially no links to alternate
> fonts */
>       fsp->space            = 0;
>       fsp->file             = (uint8_t *) U_strdup((char *) filename);
>       fsp->fontspec            = (uint8_t *) U_strdup((char *) fontspec);
>       fsp->fpat             = fpat;
>       fsp->fsize            = fd;
>       break;
>    }
>    /* release FC's own memory related to this call that does not need to be
> kept around so that face will work */
>    if(pattern)FcPatternDestroy(pattern); /* done with this memory */
>
> and here is the valgrind log:
>
> 45 bytes in 2 blocks are still reachable in loss record 26,064 of 38,661
>    at 0x402BE68: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
>    by 0x4FAFD42: ??? (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
>    by 0x4FB0914: ??? (in /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
>    by 0x4FADF4B: FcNameParse (in
> /usr/lib/i386-linux-gnu/libfontconfig.so.1.4.4)
>    by 0x83868EF: ftinfo_load_fontname (text_reassemble.c:750)
>    by 0x83A4F57:
> Inkscape::Extension::Internal::Emf::myEnhMetaFileProc(char*, unsigned int,
> Inkscape::Extension::Internal::EMF_CALLBACK_DATA*) (emf-inout.cpp:3047)
>    by 0x83A782D:
> Inkscape::Extension::Internal::Emf::open(Inkscape::Extension::Input*, char
> const*) (emf-inout.cpp:3429)
>    by 0x8322F09: Inkscape::Extension::Input::open(char const*)
> (input.cpp:153)
>    by 0x8320A99: Inkscape::Extension::open(Inkscape::Extension::Extension*,
> char const*) (system.cpp:117)
>    by 0x80F58FC: sp_file_open(Glib::ustring const&,
> Inkscape::Extension::Extension*, bool, bool) (file.cpp:274)
>    by 0x8087762: sp_main_gui(int, char const**) (main.cpp:1065)
>
> Thank you,
>
> David Mathog
> mathog at caltech.edu
> Manager, Sequence Analysis Facility, Biology Division, Caltech
>
> _______________________________________________
> Fontconfig mailing list
> Fontconfig at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/fontconfig



-- 
Akira TAGOH


More information about the Fontconfig mailing list