summaryrefslogtreecommitdiff
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
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.
-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.