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