Commit 02030555 authored by Akira TAGOH's avatar Akira TAGOH

Workaround the race condition issue on updating cache

parent 9161ed1e
......@@ -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, int *changed)
scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose, FcBool recursive, int *changed)
{
int ret = 0;
const FcChar8 *dir;
......@@ -141,7 +141,7 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
fflush (stdout);
}
if (FcStrSetMember (processed_dirs, dir))
if (recursive && FcStrSetMember (processed_dirs, dir))
{
if (verbose)
printf ("skipping, looped directory detected\n");
......@@ -213,32 +213,37 @@ scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force,
ret++;
}
}
subdirs = FcStrSetCreate ();
if (!subdirs)
if (recursive)
{
fprintf (stderr, "%s: Can't create subdir set\n", dir);
ret++;
FcDirCacheUnload (cache);
continue;
}
for (i = 0; i < FcCacheNumSubdir (cache); i++)
FcStrSetAdd (subdirs, FcCacheSubdir (cache, i));
subdirs = FcStrSetCreate ();
if (!subdirs)
{
fprintf (stderr, "%s: Can't create subdir set\n", dir);
ret++;
FcDirCacheUnload (cache);
continue;
}
for (i = 0; i < FcCacheNumSubdir (cache); i++)
FcStrSetAdd (subdirs, FcCacheSubdir (cache, i));
FcDirCacheUnload (cache);
FcDirCacheUnload (cache);
sublist = FcStrListCreate (subdirs);
FcStrSetDestroy (subdirs);
if (!sublist)
{
fprintf (stderr, "%s: Can't create subdir list\n", dir);
ret++;
continue;
sublist = FcStrListCreate (subdirs);
FcStrSetDestroy (subdirs);
if (!sublist)
{
fprintf (stderr, "%s: Can't create subdir list\n", dir);
ret++;
continue;
}
FcStrSetAdd (processed_dirs, dir);
ret += scanDirs (sublist, config, force, really_force, verbose, recursive, changed);
FcStrListDone (sublist);
}
FcStrSetAdd (processed_dirs, dir);
ret += scanDirs (sublist, config, force, really_force, verbose, changed);
else
FcDirCacheUnload (cache);
}
FcStrListDone (list);
return ret;
}
......@@ -366,7 +371,11 @@ main (int argc, char **argv)
}
changed = 0;
ret = scanDirs (list, config, force, really_force, verbose, &changed);
ret = scanDirs (list, config, force, really_force, verbose, FcTrue, &changed);
/* 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);
/*
* Try to create CACHEDIR.TAG anyway.
......@@ -379,6 +388,8 @@ main (int argc, char **argv)
cleanCacheDirectories (config, verbose);
FcConfigDestroy (config);
FcFini ();
/*
* Now we need to sleep a second (or two, to be extra sure), to make
* sure that timestamps for changes after this run of fc-cache are later
......@@ -386,8 +397,7 @@ main (int argc, char **argv)
* sleep(3) can't be interrupted by a signal here -- this isn't in the
* library, and there aren't any signals flying around here.
*/
FcConfigDestroy (config);
FcFini ();
/* the resolution of mtime on FAT is 2 seconds */
if (changed)
sleep (2);
if (verbose)
......
......@@ -974,6 +974,9 @@ FcStrSetDestroy (FcStrSet *set);
FcPublic FcStrList *
FcStrListCreate (FcStrSet *set);
FcPublic void
FcStrListFirst (FcStrList *list);
FcPublic FcChar8 *
FcStrListNext (FcStrList *list);
......
......@@ -1374,6 +1374,12 @@ FcStrListCreate (FcStrSet *set)
return list;
}
void
FcStrListFirst (FcStrList *list)
{
list->n = 0;
}
FcChar8 *
FcStrListNext (FcStrList *list)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment