[Fontconfig] fc-cache does not work with Cygwin

Michael Garvin mgarvin at bell.net
Mon Nov 29 14:19:00 PST 2010


If mkdir is used, it would mean you can't store the PID...I guess you could encode it in the directory name though.   A quick google didn't turn up anything comparing mkdir vs link in this context.  Although there is this:

http://wiki.bash-hackers.org/howto/mutex

They preference there seems to be for mkdir, as its just a single step (less complicated).    In theory I guess when link() is called it will fail if the link is already there, so that should eliminate the chance of a race condition.  But still its a more complicated approach I think.

(^_^)/
mike.



> Date: Mon, 29 Nov 2010 16:25:49 -0500
> From: behdad at behdad.org
> To: mike at littlemdesign.com
> CC: fontconfig at lists.freedesktop.org
> Subject: Re: [Fontconfig] fc-cache does not work with Cygwin
> 
> Thanks Michael for debugging this.
> 
> Anyone on the list has any idea why using link() instead of mkdir() may be
> safer?  How do the two compare on NFS systems?
> 
> If mkdir() is just as good, I think we should simply switch to that.
> Otherwise, maybe try the mkdir() if link() fails.
> 
> behdad
> 
> On 11/29/10 03:41, Michael Garvin wrote:
> > Hi again, ok the is resolved for me; I’m on Windows XP (FAT32 files
> > sytem), so hard linking is not supported.  For now, I’ve updated the
> > file lock code like this:
> > 
> >  
> > 
> > #undef HAVE_LINK
> > 
> >  
> > 
> > I wasn’t sure if using symlink would be valid in the context of lock
> > files so I just switched it to using a directory.  It works fine now J
> > 
> >  
> > 
> > Not sure how many people out there are going to use this stuff on an XP
> > machine with FAT32 file systems, under cygwin, but if you could add more
> > verbose error messages around the failure conditions it would help debug
> > things a lot quicker.  It took me all night to bottom this out L I think
> > a lot of people would have just disabled freetype. L
> > 
> >  
> > 
> > (^_^)/
> > 
> > Mike.
> > 
> >  
> > 
> >  
> > 
> > *From:* fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org
> > [mailto:fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org] *On
> > Behalf Of *Michael Garvin
> > *Sent:* November 29, 2010 3:30 AM
> > *To:* fontconfig at lists.freedesktop.org
> > *Subject:* Re: [Fontconfig] fc-cache does not work with Cygwin
> > 
> >  
> > 
> > Hi, ok so I dug in deeper and it seems that fontconfig’s method of file
> > locking isn’t really compatibile with cygwin (or cygwin doesn’t fully
> > emulate Linux). 
> > 
> >  
> > 
> > When font config tries to “hard link” tempory lock file, cygwin gives a
> > permission denied error.  I can replicate it by commenting out the
> > unlink() calls and then from the command line trying a ‘link’ from the
> > mkstemp file to some name.
> > 
> >  
> > 
> > From my printf’ized fc-cache:
> > 
> >  
> > 
> > bash-3.2$ ./fc-cache.exe --force --really-force /usr/share/fonts/Type1
> > 
> > FC_DEBUG=
> > 
> > X: FcDirCacheWrite writing out cache...
> > 
> > X: FcDirCacheWrite found dir to use for caching: /home/Mike/.fonts.cache-2
> > 
> > X: FcDirCacheWrite doing FcAtomicCreate
> > 
> > X: FcAtomicCreate will use lock file:
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.LCK
> > 
> > X: FcDirCacheWrite doing FcAtomicLock
> > 
> > X: .. using mkstemp on:
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.TMP-XXXXXX
> > 
> > X: .. fd=3
> > 
> > X: ..linking
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.TMP-T7WqPU
> > ->
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.LCK
> > 
> > X: ret=-1 errno=1
> > 
> > X: ..calling FcStat on
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.LCK
> > 
> > X: could not created lock.
> > 
> > X: FcDirCacheValid /usr/share/fonts/Type1
> > 
> > X: FcDirCacheValidConfig calling through to FcDirCacheProcess
> > 
> > X: FcDirCacheProcess
> > cache_base=/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3
> > 
> > X: FcDirCacheProcess
> > cache_hashed=/home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3
> > 
> > X: opening
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3 O_RDONLY
> > | O_BINARY
> > 
> > X: FcDirCacheProcess fd=-1
> > 
> > /usr/share/fonts/Type1: failed to write cache
> > 
> > bash-3.2$
> > 
> >  
> > 
> > Now if I try to do the hard link manually:
> > 
> >  
> > 
> > link 
> > ~/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.TMP-Wl6CrD
> > ~/.fonts.cache-2/mike
> > 
> > link: cannot create link `/home/Mike/.fonts.cache-2/mike' to
> > `/home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3.TMP-Wl6CrD':
> > Operation not permitted
> > 
> > bash-3.2$ echo $?
> > 
> > 1
> > 
> >  
> > 
> >  
> > 
> > I checked my umask and stuff and that looks fine; also nothing in
> > FcAtomicLock changes the umask, so if it can create the temp file (and
> > it can) it should be able to create a link to it in the same directory.
> > 
> >  
> > 
> > Maybe this is  a Cygwin limitation, hard links are not allowed?  I think
> > this may have to be done with directories on Cygwin.
> > 
> >  
> > 
> > (^_^)/
> > 
> > Mike.
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> > *From:* fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org
> > [mailto:fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org] *On
> > Behalf Of *Michael Garvin
> > *Sent:* November 29, 2010 2:39 AM
> > *To:* fontconfig at lists.freedesktop.org
> > *Subject:* Re: [Fontconfig] fc-cache does not work with Cygwin
> > 
> >  
> > 
> > Looks like I can replicate the problem now; its trying to write the
> > cache but the call to get a lock is failing, this code:
> > 
> >  
> > 
> > FcDirCacheWrite (FcCache *cache, FcConfig *config)
> > 
> > …
> > 
> >     if (!FcAtomicLock (atomic))
> > 
> >         goto bail3;
> > 
> >  
> > 
> > Is leading to a silent failure (just returns false), i.e. bail3 gets
> > executed.  I’ll try to dig a little deeper, maybe my Cygwin is not doing
> > locks right or something.  Would have been nice if there was some kind
> > of visible error message about this.
> > 
> >  
> > 
> > (^_^)/
> > 
> > Mike.
> > 
> >  
> > 
> > *From:* fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org
> > [mailto:fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org] *On
> > Behalf Of *Michael Garvin
> > *Sent:* November 29, 2010 2:24 AM
> > *To:* fontconfig at lists.freedesktop.org
> > *Subject:* Re: [Fontconfig] fc-cache does not work with Cygwin
> > 
> >  
> > 
> > Some additional detail; I set FC_DEBUG=8063 and ran an unmodified
> > version of fc-cache:
> > 
> >  
> > 
> > FC_DEBUG=8063
> > 
> >         Loading config file /etc/fonts/fonts.conf
> > 
> > …
> > 
> >  
> > 
> > cache scan dir /usr/share/fonts/Type1
> > 
> >  
> > 
> > using FreeType family "Utopia"
> > 
> > using FreeType style "Bold Italic"
> > 
> >         Type1 weight Bold maps to 200
> > 
> >         Style Bold Italic maps to width -1
> > 
> >         Style Bold Italic maps to slant 100
> > 
> >         Style Bold Italic maps to decorative 0
> > 
> > font charset
> > 
> >         0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff
> > ffffffff ffffffff
> > 
> >         0001: 00000000 00020000 000c0006 61000003 00040000 00000000
> > 00000000 00000000
> > 
> > …
> > 
> >  
> > 
> > <does the build up of the font cache for that directory in memory>
> > 
> > ….
> > 
> > charsets 29 -> 4 leaves 251 -> 24
> > 
> > FcDirCacheWriteDir dir "/usr/share/fonts/Type1" file
> > "/home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-x86.cache-3"
> > 
> > /usr/share/fonts/Type1: failed to write cache
> > 
> > Fc Memory Usage:
> > 
> >            Which       Alloc           Free           Active
> > 
> >                    count   bytes   count   bytes   count   bytes
> > 
> >          charset    3970   74626    3970   32362       0   42264
> > 
> >  
> > 
> > Some how (not sure how), it is managing to get through to the section of
> > code where it actually tries to write out to disk.  But…that is failing
> > as well.  I’ll dig deeper to see if I can identify why the default
> > Cygwin binary is getting to that stage and the one compiled from source
> > is not.  I think the Cygwin one might be patched somehow.  Still fails
> > though L
> > 
> >  
> > 
> > (^_^)/
> > 
> > Mike.
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> > *From:* fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org
> > [mailto:fontconfig-bounces+mgarvin=bell.net at lists.freedesktop.org] *On
> > Behalf Of *Michael Garvin
> > *Sent:* November 29, 2010 2:05 AM
> > *To:* fontconfig at lists.freedesktop.org
> > *Subject:* [Fontconfig] fc-cache does not work with Cygwin
> > 
> >  
> > 
> > Hi, I’ve been trying to fix the problem with all of my Cygwin (Widnows
> > XP) Gtk and Qt applications being slow (taking about 5minutes to
> > startup).  I’ve been able to verify that the issue is due to Freetype
> > being used, and in turn; font-config being used to list off the
> > available fonts on startup. The problem is that font-config never
> > actually caches anything, so any font-config using application, has the
> > same (realliy bad) start up time…every time.
> > 
> >  
> > 
> > I tried running fc-cache manually but to no avail; I double checked time
> > stamps, having write permission any problems with the configuration
> > file, bad install of the Cygwin packages etc, but no matter what,
> > fc-cache always fails on all possible font directories with:
> > 
> >  
> > 
> >   failed to write cache
> > 
> >  
> > 
> > After googling around trying all the suggested solutions, nothing was
> > helping, and I ran strace and looked through the detailed system calls.
> >  It turns out fc-cache tries to open cache files in read only mode.
> >    Which means there is no way it can create cache files L
> > 
> >  
> > 
> > So, I downloaded the source, compiled it up and added printf statements
> > throughout the call chain from scanDirs() downwards, and picked a single
> > directory to try and cache (the Type1 fonts directory for Cygwin).  This
> > is what I see:
> > 
> >  
> > 
> > bash-3.2$ ./fc-cache.exe --force --really-force /usr/share/fonts/Type1/
> > 
> > X: FcDirCacheValid /usr/share/fonts/Type1
> > 
> > X: FcDirCacheValidConfig calling through to FcDirCacheProcess
> > 
> > X: FcDirCacheProcess
> > cache_base=/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3
> > 
> > X: FcDirCacheProcess
> > cache_hashed=/home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3
> > 
> > X: opening
> > /home/Mike/.fonts.cache-2/d62e99ef547d1d24cdb1bd22ec1a2976-le32d8.cache-3 O_RDONLY
> > | O_BINARY
> > 
> > X: FcDirCacheProcess fd=-1
> > 
> > /usr/share/fonts/Type1: failed to write cache
> > 
> > bash-3.2$
> > 
> >  
> > 
> > The X: … lines are my printf statements I added to the code.
> > 
> >  
> > 
> > I looked through the code by hand, from main(), to scanDirs() and
> > downwards, there is no possible way that I can see for fc-cache to
> > actually create caches on disk.   The code that prints out the failed to
> > write cache message is just calling FcDirCacheValid(), but this function
> > is not used to create cache files (the error message of “write failed is
> > meaningless), only to open then and check that they are valid (hence
> > strace shows opening of cache files in read only mode with no creat
> > flag..consistent at least).
> > 
> >  
> > 
> > So from what I can tell, fc-cache is not the program to use to populate
> > the font caches the very first time. 
> > 
> >  
> > 
> > My question is, what program do I use?  Can you update your
> > documentation to correctly point to the right program to use? 
> > 
> >  
> > 
> > This has been very frustrating to try and track down.   I guess when I
> > have time next, I’ll try to understand the “init” call tree that
> > actually does call the functions which build cache files
> > (FcDirCacheScan), and maybe write a little program that specificalliy
> > calls those functions so I can get my caches populated, but I really
> > don’t think I should have to do that.   fc-cache should work as its
> > manpage says L
> > 
> >  
> > 
> > (^_^)/
> > 
> > Mike.
> > 
> >  
> > 
> > Michael Garvin
> > 
> > mgarvin at bell.net <mailto:mgarvin at bell.net>
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> >  
> > 
> > 
> > 
> > _______________________________________________
> > Fontconfig mailing list
> > Fontconfig at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/fontconfig
> _______________________________________________
> Fontconfig mailing list
> Fontconfig at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/fontconfig
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/fontconfig/attachments/20101129/48e2d161/attachment-0001.html>


More information about the Fontconfig mailing list