summaryrefslogtreecommitdiff
path: root/fc-cache
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2013-11-05 20:30:35 +0900
committerAkira TAGOH <akira@tagoh.org>2013-11-05 20:30:35 +0900
commita4443e64c89256087d40462cfbb482950873e366 (patch)
treefe604a6b955b0842073d425df5310ad553e43f80 /fc-cache
parent0b7f42f777a14ee61783fd95dd04e870f02d201e (diff)
downloadfontconfig-a4443e64c89256087d40462cfbb482950873e366.tar.gz
Re-scan font directories only when it contains subdirs
Somewhat improves the performance but still need to think about for the situation where both directories and fonts are in.
Diffstat (limited to 'fc-cache')
-rw-r--r--fc-cache/fc-cache.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/fc-cache/fc-cache.c b/fc-cache/fc-cache.c
index af7ba6d..27c7513 100644
--- a/fc-cache/fc-cache.c
+++ b/fc-cache/fc-cache.c
@@ -118,7 +118,7 @@ usage (char *program, int error)
static FcStrSet *processed_dirs;
static int
-scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, FcBool recursive, int *changed)
+scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, FcBool recursive, int *changed, FcStrSet *updateDirs)
{
int ret = 0;
const FcChar8 *dir;
@@ -137,7 +137,10 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
{
if (verbose)
{
- printf ("%s: ", dir);
+ if (!recursive)
+ printf ("Re-scanning %s: ", dir);
+ else
+ printf ("%s: ", dir);
fflush (stdout);
}
@@ -226,6 +229,8 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
}
for (i = 0; i < FcCacheNumSubdir (cache); i++)
FcStrSetAdd (subdirs, FcCacheSubdir (cache, i));
+ if (updateDirs && FcCacheNumSubdir (cache) > 0)
+ FcStrSetAdd (updateDirs, dir);
FcDirCacheUnload (cache);
@@ -238,7 +243,7 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
continue;
}
FcStrSetAdd (processed_dirs, dir);
- ret += scanDirs (sublist, config, force, really_force, verbose, recursive, changed);
+ ret += scanDirs (sublist, config, force, really_force, verbose, recursive, changed, updateDirs);
FcStrListDone (sublist);
}
else
@@ -271,7 +276,7 @@ cleanCacheDirectories (FcConfig *config, FcBool verbose)
int
main (int argc, char **argv)
{
- FcStrSet *dirs;
+ FcStrSet *dirs, *updateDirs;
FcStrList *list;
FcBool verbose = FcFalse;
FcBool force = FcFalse;
@@ -369,13 +374,18 @@ main (int argc, char **argv)
fprintf(stderr, "Cannot malloc\n");
return 1;
}
-
+
+ updateDirs = FcStrSetCreate ();
changed = 0;
- ret = scanDirs (list, config, force, really_force, verbose, FcTrue, &changed);
+ ret = scanDirs (list, config, force, really_force, verbose, FcTrue, &changed, updateDirs);
/* Update the directory cache again to avoid the race condition as much as possible */
- FcStrListFirst (list);
- ret += scanDirs (list, config, FcTrue, really_force, verbose, FcFalse, &changed);
FcStrListDone (list);
+ list = FcStrListCreate (updateDirs);
+ if (list)
+ {
+ ret += scanDirs (list, config, FcTrue, really_force, verbose, FcFalse, &changed, NULL);
+ FcStrListDone (list);
+ }
/*
* Try to create CACHEDIR.TAG anyway.