Commit fdbd9d13 authored by Akira TAGOH's avatar Akira TAGOH

Fix cache conflicts on OSTree based system

mtime isn't reliable to detect updates of fonts on OSTree based system
since they reset mtime to 0 for system files.
Due to this, there are the situation likely to happen where mtime is
newer but content is older.

Fortunately, OSTree based system requires reboot to deploy changes. so
we can assume we won't see any changes on system fonts. so system caches
are always up-to-date. we can ignore meta data for system fonts in
user caches.
parent 6edaaa4d
Pipeline #148354 failed with stage
in 2 minutes and 58 seconds
......@@ -845,7 +845,7 @@ FcCacheTimeValid (FcConfig *config, FcCache *cache, struct stat *dir_stat)
FcCacheDir (cache), cache->checksum, (int) dir_stat->st_mtime);
#endif
return cache->checksum == (int) dir_stat->st_mtime && fnano;
return dir_stat->st_mtime == 0 || (cache->checksum == (int) dir_stat->st_mtime && fnano);
}
static FcBool
......@@ -1041,17 +1041,39 @@ static FcBool
FcDirCacheMapHelper (FcConfig *config, int fd, struct stat *fd_stat, struct stat *dir_stat, struct timeval *latest_cache_mtime, void *closure)
{
FcCache *cache = FcDirCacheMapFd (config, fd, fd_stat, dir_stat);
struct timeval cache_mtime;
struct timeval cache_mtime, zero_mtime = { 0, 0}, dir_mtime;
if (!cache)
return FcFalse;
cache_mtime.tv_sec = fd_stat->st_mtime;
dir_mtime.tv_sec = dir_stat->st_mtime;
#ifdef HAVE_STRUCT_STAT_ST_MTIM
cache_mtime.tv_usec = fd_stat->st_mtim.tv_nsec / 1000;
dir_mtime.tv_usec = dir_stat->st_mtim.tv_nsec / 1000;
#else
cache_mtime.tv_usec = 0;
dir_mtime.tv_usec = 0;
#endif
if (timercmp (latest_cache_mtime, &cache_mtime, <))
/* special take care of OSTree */
if (!timercmp (&zero_mtime, &dir_mtime, !=))
{
if (!timercmp (&zero_mtime, &cache_mtime, !=))
{
if (*((FcCache **) closure))
FcDirCacheUnload (*((FcCache **) closure));
}
else if (*((FcCache **) closure) && !timercmp (&zero_mtime, latest_cache_mtime, !=))
{
FcDirCacheUnload (cache);
return FcFalse;
}
else if (timercmp (latest_cache_mtime, &cache_mtime, <))
{
if (*((FcCache **) closure))
FcDirCacheUnload (*((FcCache **) closure));
}
}
else if (timercmp (latest_cache_mtime, &cache_mtime, <))
{
if (*((FcCache **) closure))
FcDirCacheUnload (*((FcCache **) closure));
......
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