[Fontconfig] Re: Structure of cache files

Patrick Lam plam at MIT.EDU
Tue Dec 6 20:04:30 PST 2005


Josselin Mouette wrote:
> It would indeed solve both problems simultaneously.
> Maybe, for performance, would it be better to
> use /var/cache/fontconfig/$hash.cache files, $hash being generated from
> the original pathname ?

How does the attached patch look?  Is fontconfig supposed to be
responsible for creating /var/cache/fontconfig, or can it rely on the
packager?  Also is hardcoding /var/cache/fontconfig the right thing?

pat
-------------- next part --------------
Index: fontconfig/fontconfig.h
===================================================================
RCS file: /cvs/fontconfig/fontconfig/fontconfig/fontconfig.h,v
retrieving revision 1.69.2.15
diff -u -p -r1.69.2.15 fontconfig.h
--- fontconfig/fontconfig.h	24 Nov 2005 21:40:20 -0000	1.69.2.15
+++ fontconfig/fontconfig.h	7 Dec 2005 04:00:31 -0000
@@ -104,6 +104,8 @@ typedef int		FcBool;
 #define FC_EMBOLDEN	    "embolden"		/* Bool - true if emboldening needed*/
 #define FC_EMBEDDED_BITMAP  "embeddedbitmap"	/* Bool - true to enable embedded bitmaps */
 
+#define FC_VAR_CACHE_DIR	    "/var/cache/fontconfig/"
+#define FC_CACHE_SUFFIX		    ".cache-"FC_CACHE_VERSION
 #define FC_DIR_CACHE_FILE	    "fonts.cache-"FC_CACHE_VERSION
 #define FC_USER_CACHE_FILE	    ".fonts.cache-"FC_CACHE_VERSION
 
Index: src/fccache.c
===================================================================
RCS file: /cvs/fontconfig/fontconfig/src/fccache.c,v
retrieving revision 1.23.4.37
diff -u -p -r1.23.4.37 fccache.c
--- src/fccache.c	29 Nov 2005 14:57:10 -0000	1.23.4.37
+++ src/fccache.c	7 Dec 2005 04:00:31 -0000
@@ -723,6 +723,8 @@ FcBool
 FcDirCacheRead (FcFontSet * set, FcStrSet * dirs, const FcChar8 *dir)
 {
     char *cache_file = (char *)FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
+    char hash[9];
+    char *cache_hashed;
     int fd;
     char * current_arch_machine_name;
     char candidate_arch_machine_name[9+MACHINE_SIGNATURE_SIZE];
@@ -732,10 +734,17 @@ FcDirCacheRead (FcFontSet * set, FcStrSe
     if (!cache_file)
         goto bail;
 
+    sprintf (hash, "%8x", FcStringHash ((FcChar8 *)cache_file));
+    cache_hashed = (char *)FcStrPlus ((FcChar8 *)FC_VAR_CACHE_DIR, FcStrPlus ((FcChar8 *)hash, (FcChar8 *)FC_CACHE_SUFFIX));
+
     current_arch_machine_name = FcCacheMachineSignature();
-    fd = open(cache_file, O_RDONLY);
+    fd = open(cache_hashed, O_RDONLY);
     if (fd == -1)
-        goto bail;
+    {
+	fd = open (cache_file, O_RDONLY);
+	if (fd == -1)
+	    goto bail;
+    }
 
     current_arch_start = FcCacheSkipToArch(fd, current_arch_machine_name);
     if (current_arch_start < 0)
@@ -845,6 +854,8 @@ FcBool
 FcDirCacheWrite (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
 {
     FcChar8         *cache_file = FcStrPlus (dir, (FcChar8 *) "/" FC_DIR_CACHE_FILE);
+    char 	    hash[9];
+    FcChar8 	    *cache_hashed;
     int 	    fd, fd_orig, i, dirs_count;
     FcAtomic 	    *atomic;
     FcCache 	    metadata;
@@ -856,6 +867,9 @@ FcDirCacheWrite (FcFontSet *set, FcStrSe
     if (!cache_file)
         goto bail;
 
+    sprintf (hash, "%8x", FcStringHash ((FcChar8 *)cache_file));
+    cache_hashed = FcStrPlus ((FcChar8 *)FC_VAR_CACHE_DIR, FcStrPlus ((FcChar8 *)hash, (FcChar8 *)FC_CACHE_SUFFIX));
+
     current_dir_block = FcDirCacheProduce (set, &metadata);
 
     if (metadata.count && !current_dir_block)
@@ -864,9 +878,13 @@ FcDirCacheWrite (FcFontSet *set, FcStrSe
     if (FcDebug () & FC_DBG_CACHE)
         printf ("FcDirCacheWriteDir cache_file \"%s\"\n", cache_file);
 
-    atomic = FcAtomicCreate (cache_file);
+    atomic = FcAtomicCreate (cache_hashed);
     if (!atomic)
-        goto bail0;
+    {
+	atomic = FcAtomicCreate (cache_file);
+	if (!atomic)
+	    goto bail0;
+    }
 
     if (!FcAtomicLock (atomic))
         goto bail1;


More information about the Fontconfig mailing list