Improve the performance issue on rescanning directories
This commit is contained in:
parent
5c725f2f58
commit
7a6622f25c
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
44
src/fcdir.c
44
src/fcdir.c
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
22
src/fcfs.c
22
src/fcfs.c
|
@ -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__
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue