[cache] After writing cache to file, update the internal copy to reflect this

Only do it for small caches though.  For large cache we'd better off loading
the cache file again, mmap()ing it.

Based on patch from Diego Santa Cruz.
This commit is contained in:
Behdad Esfahbod 2009-02-05 02:46:16 -05:00
parent ecce22d40c
commit b697fa2523
1 changed files with 16 additions and 0 deletions

View File

@ -844,6 +844,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
FcStrList *list; FcStrList *list;
FcChar8 *cache_dir = NULL; FcChar8 *cache_dir = NULL;
FcChar8 *test_dir; FcChar8 *test_dir;
FcCacheSkip *skip;
struct stat cache_stat;
int magic; int magic;
int written; int written;
@ -929,6 +931,20 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
close(fd); close(fd);
if (!FcAtomicReplaceOrig(atomic)) if (!FcAtomicReplaceOrig(atomic))
goto bail4; goto bail4;
/* If the file is small, update the cache chain entry such that the
* new cache file is not read again. If it's large, we don't do that
* such that we reload it, using mmap, which is shared across processes.
*/
if (cache->size < FC_CACHE_MIN_MMAP &&
(skip = FcCacheFindByAddr (cache)) &&
FcStat (cache_hashed, &cache_stat))
{
skip->cache_dev = cache_stat.st_dev;
skip->cache_ino = cache_stat.st_ino;
skip->cache_mtime = cache_stat.st_mtime;
}
FcStrFree (cache_hashed); FcStrFree (cache_hashed);
FcAtomicUnlock (atomic); FcAtomicUnlock (atomic);
FcAtomicDestroy (atomic); FcAtomicDestroy (atomic);