Improve the performance issue on rescanning directories

This commit is contained in:
Akira TAGOH 2013-12-05 19:15:47 +09:00
parent 5c725f2f58
commit 7a6622f25c
7 changed files with 99 additions and 3 deletions

View File

@ -186,9 +186,14 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
} }
if (!cache) if (!cache)
{
if (!recursive)
cache = FcDirCacheRescan (dir, config);
else
{ {
(*changed)++; (*changed)++;
cache = FcDirCacheRead (dir, FcTrue, config); cache = FcDirCacheRead (dir, FcTrue, config);
}
if (!cache) if (!cache)
{ {
fprintf (stderr, "%s: error scanning\n", dir); fprintf (stderr, "%s: error scanning\n", dir);
@ -386,6 +391,7 @@ main (int argc, char **argv)
ret += scanDirs (list, config, FcTrue, really_force, verbose, FcFalse, &changed, NULL); ret += scanDirs (list, config, FcTrue, really_force, verbose, FcFalse, &changed, NULL);
FcStrListDone (list); FcStrListDone (list);
} }
FcStrSetDestroy (updateDirs);
/* /*
* Try to create CACHEDIR.TAG anyway. * Try to create CACHEDIR.TAG anyway.

View File

@ -542,6 +542,9 @@ FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir);
FcPublic FcCache * FcPublic FcCache *
FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file); FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file);
FcPublic FcCache *
FcDirCacheRescan (const FcChar8 *dir, FcConfig *config);
FcPublic FcCache * FcPublic FcCache *
FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config); FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config);

View File

@ -828,6 +828,19 @@ bail1:
return NULL; return NULL;
} }
FcCache *
FcDirCacheRebuild (FcCache *cache, struct stat *dir_stat, FcStrSet *dirs)
{
FcCache *new;
FcFontSet *set = FcFontSetDeserialize (FcCacheSet (cache));
const FcChar8 *dir = FcCacheDir (cache);
new = FcDirCacheBuild (set, dir, dir_stat, dirs);
FcFontSetDestroy (set);
return new;
}
/* write serialized state to the cache file */ /* write serialized state to the cache file */
FcBool FcBool
FcDirCacheWrite (FcCache *cache, FcConfig *config) FcDirCacheWrite (FcCache *cache, FcConfig *config)

View File

@ -130,7 +130,12 @@ FcFileScanConfig (FcFontSet *set,
if (FcFileIsDir (file)) if (FcFileIsDir (file))
return FcStrSetAdd (dirs, file); return FcStrSetAdd (dirs, file);
else else
{
if (set)
return FcFileScanFontConfig (set, blanks, file, config); return FcFileScanFontConfig (set, blanks, file, config);
else
return FcTrue;
}
} }
FcBool FcBool
@ -306,6 +311,45 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
return cache; return cache;
} }
FcCache *
FcDirCacheRescan (const FcChar8 *dir, FcConfig *config)
{
FcCache *cache = FcDirCacheLoad (dir, config, NULL);
FcCache *new = NULL;
struct stat dir_stat;
FcStrSet *dirs;
if (!cache)
return NULL;
if (FcStatChecksum (dir, &dir_stat) < 0)
goto bail;
dirs = FcStrSetCreate ();
if (!dirs)
goto bail;
/*
* Scan the dir
*/
if (!FcDirScanConfig (NULL, dirs, NULL, dir, FcTrue, config))
goto bail1;
/*
* Rebuild the cache object
*/
new = FcDirCacheRebuild (cache, &dir_stat, dirs);
if (!new)
goto bail1;
FcDirCacheUnload (cache);
/*
* Write out the cache file, ignoring any troubles
*/
FcDirCacheWrite (new, config);
bail1:
FcStrSetDestroy (dirs);
bail:
return new;
}
/* /*
* Read (or construct) the cache for a directory * Read (or construct) the cache for a directory
*/ */

View File

@ -122,6 +122,28 @@ FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s)
return s_serialize; return s_serialize;
} }
FcFontSet *
FcFontSetDeserialize (const FcFontSet *set)
{
int i;
FcFontSet *new = FcFontSetCreate ();
if (!new)
return NULL;
for (i = 0; i < set->nfont; i++)
{
if (!FcFontSetAdd (new, FcPatternDuplicate (FcFontSetFont (set, i))))
goto bail;
}
return new;
bail:
FcFontSetDestroy (new);
return NULL;
}
#define __fcfs__ #define __fcfs__
#include "fcaliastail.h" #include "fcaliastail.h"
#undef __fcfs__ #undef __fcfs__

View File

@ -567,6 +567,9 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config);
FcPrivate FcCache * FcPrivate FcCache *
FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs); FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs);
FcPrivate FcCache *
FcDirCacheRebuild (FcCache *cache, struct stat *dir_stat, FcStrSet *dirs);
FcPrivate FcBool FcPrivate FcBool
FcDirCacheWrite (FcCache *cache, FcConfig *config); FcDirCacheWrite (FcCache *cache, FcConfig *config);
@ -838,6 +841,9 @@ FcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s);
FcPrivate FcFontSet * FcPrivate FcFontSet *
FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s); FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s);
FcPrivate FcFontSet *
FcFontSetDeserialize (const FcFontSet *set);
/* fchash.c */ /* fchash.c */
FcPrivate FcChar8 * FcPrivate FcChar8 *
FcHashGetSHA256Digest (const FcChar8 *input_strings, FcHashGetSHA256Digest (const FcChar8 *input_strings,

View File

@ -33,6 +33,7 @@ FcPatternCreate (void)
p = (FcPattern *) malloc (sizeof (FcPattern)); p = (FcPattern *) malloc (sizeof (FcPattern));
if (!p) if (!p)
return 0; return 0;
memset (p, 0, sizeof (FcPattern));
p->num = 0; p->num = 0;
p->size = 0; p->size = 0;
p->elts_offset = FcPtrToOffset (p, NULL); p->elts_offset = FcPtrToOffset (p, NULL);
@ -1310,6 +1311,7 @@ FcValueListSerialize (FcSerialize *serialize, const FcValueList *vl)
} }
return head_serialized; return head_serialized;
} }
#define __fcpat__ #define __fcpat__
#include "fcaliastail.h" #include "fcaliastail.h"
#include "fcftaliastail.h" #include "fcftaliastail.h"