[Fontconfig] mmap-ed caches + patch

Matthias Clasen mclasen at redhat.com
Wed Sep 28 02:19:48 EST 2005


On Tue, 2005-09-27 at 18:12 +0200, Lubos Lunak wrote:
> On Tuesday 27 September 2005 17:47, Patrick Lam wrote:
> > Lubos Lunak wrote:
> > >  However, when I tested the 2.3.90 release yesterday, I was originally
> > > disappointed to see it performed noticeably worse than the last stable
> > > version. Short version: Please apply the attached patch. Longer version:
> > > The problem turned out to be directories that contain files that
> > > fontconfig doesn't seem to use yet it analyses them (.pcf.gz files). If a
> > > directory contains only .pcf.gz files and has no subdirectories, then the
> > > code that the patch removes will not write a cache file, yet the return
> > > FcTrue means the directory has been successfully cached. However if you
> > > look in
> > > FcCacheReadDirs() you can see that if it can't use the cache file it will
> > > call FcDirScanConfig(). So I suggest the attached patch which will write
> > > a more or less empty cache file even in such directories.
> >
> > I'm not sure that this patch will not cause problems.  I think that I
> > want to generate a zero-length file in such a case, without a header at
> > all. But I'm a bit confused: when I run fc-cache in a directory with 
> > only pcf.gz files, fc-cache *does* generate a fonts.cache-2 file for me.
> >  Why is this different for you?
> 
>  Maybe that directory you have has also a subdirectory? In the attached file 
> there's output of 'ls' in /usr/X11R6/lib/X11/fonts/latin2/misc and also the 
> output of 'fc-cache -f -v'. You can see that it says 0 fonts, 0 dirs, which 
> AFAICS exactly matches the condition my patches removes.
> 
> >
> > >  And, actually, it seems I've just found another problem :(. If I run
> > > Konqueror, run 'fc-cache -f' and go back to Konqueror, it crashes quite
> > > soon. Guessing from strace of fc-cache, where I cannot see any call to
> > > unlink(), and from the calls to ftruncate() I assume that the new cache
> > > file contents are written directly in the same file instead of unlinking
> > > the old file first, and fontconfig doesn't survive that. As I don't
> > > understand the code that much I cannot confirm this theory for sure,
> > > which also means no patch for this, sorry :).
> >
> > Which cache file are you talking about?  $HOME/.fonts.cache-2, or a
> > directory cache?  (Are you running fc-cache as root?)
> 
>  Any cache file I'd say (and yes, I ran fc-cache as root). AFAIK if you 
> truncate a file that's mmap-ed, any access to the no longer existing part of 
> the file results in bad things. I don't know the structure of the cache file, 
> it seems to me it can be built in several steps for different architectures, 
> but I'd expect that the code can't cope with the data simply changing under 
> its hands, and unless the format specifically prevents that I'd expect that 
> to happen. Would there be any problem if you simply unlinked the old file 
> before writing the new one?
> 

Thats what we do with other mmapped caches in GTK+, atomically replace
them by writing the new cache to a tmp file, and then moving it in
place.

Matthias




More information about the Fontconfig mailing list