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? -- Lubos Lunak KDE Developer l.lunak@xxxxxxx l.lunak@xxxxxxx -------------- next part -------------- . .. .fonts-config-timestamp 10x20.pcf.gz 14x26.pcf.gz 5x7.pcf.gz 5x8.pcf.gz 6x13.pcf.gz 6x13B.pcf.gz 6x14.pcf.gz 6x14B.pcf.gz 6x9.pcf.gz 7x13.pcf.gz 7x13B.pcf.gz 7x14.pcf.gz 7x14B.pcf.gz 8x10.pcf.gz 8x12.pcf.gz 8x12B.pcf.gz 8x14.pcf.gz 8x14B.pcf.gz 8x16.pcf.gz 8x16B.pcf.gz 8x16BS.pcf.gz 8x8.pcf.gz 9x15.pcf.gz 9x15B.pcf.gz 9x17.pcf.gz 9x17B.pcf.gz encodings.dir fonts.alias fonts.cache-1 fonts.cache-2 fonts.dir fonts.scale fc-cache: "/usr/share/fonts": skipping, 0 fonts, 2 dirs fc-cache: "/usr/share/fonts/bdf": skipping, 0 fonts, 0 dirs fc-cache: "/usr/share/fonts/wine": skipping, 15 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts": skipping, 0 fonts, 13 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/75dpi": skipping, 398 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/truetype": skipping, 25 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/Type1": skipping, 21 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/misc": skipping, 65 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/japanese": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/URW": skipping, 52 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/latin2": skipping, 0 fonts, 1 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/latin2/misc": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/CID": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/encodings": skipping, 0 fonts, 1 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/encodings/large": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/local": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/util": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/baekmuk": skipping, 0 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/X11/fonts/uni": skipping, 2 fonts, 0 dirs fc-cache: "/opt/kde3/share/fonts": skipping, 3 fonts, 1 dirs fc-cache: "/opt/kde3/share/fonts/override": skipping, 0 fonts, 0 dirs fc-cache: "/usr/lib/ooo-2.0/share/fonts": skipping, 0 fonts, 1 dirs fc-cache: "/usr/lib/ooo-2.0/share/fonts/truetype": skipping, 1 fonts, 0 dirs fc-cache: "/usr/lib/ooo-1.1/share/fonts": skipping, no such directory fc-cache: "/opt/OpenOffice.org/share/fonts": skipping, no such directory fc-cache: "/opt/staroffice6.0/share/fonts": skipping, no such directory fc-cache: "/usr/lib64/jvm/java-1.5.0-sun-1.5.0_01/jre/lib/fonts": skipping, no such directory fc-cache: "/usr/lib/jvm/java-1.5.0-sun-1.5.0_01/jre/lib/fonts": skipping, no such directory fc-cache: "/usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/fonts": skipping, 12 fonts, 0 dirs fc-cache: "/usr/X11R6/lib/Acrobat7/Resource/Font": skipping, 16 fonts, 1 dirs fc-cache: "/usr/X11R6/lib/Acrobat7/Resource/Font/PFM": skipping, 0 fonts, 0 dirs fc-cache: "/usr/local/share/fonts/": skipping, no such directory fc-cache: "/root/.fonts": skipping, no such directory fc-cache: succeeded