From b697fa2523a6d3fe091e14710d14720a9e051bf1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 5 Feb 2009 02:46:16 -0500 Subject: [PATCH] [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. --- src/fccache.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/fccache.c b/src/fccache.c index f35304a..ba28ddc 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -844,6 +844,8 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config) FcStrList *list; FcChar8 *cache_dir = NULL; FcChar8 *test_dir; + FcCacheSkip *skip; + struct stat cache_stat; int magic; int written; @@ -929,6 +931,20 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config) close(fd); if (!FcAtomicReplaceOrig(atomic)) 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); FcAtomicUnlock (atomic); FcAtomicDestroy (atomic); -- 2.39.5