[Fontconfig] fontconfig: Branch 'wip/threadsafe'

Behdad Esfahbod behdad at kemper.freedesktop.org
Mon Oct 15 17:35:29 PDT 2012


 src/fccache.c |   18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

New commits:
commit 1045a40778c1f77fd88908f7b1495c6c8f01c539
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon Oct 15 19:35:03 2012 -0500

    Make FcDirCacheDispose() threadsafe

diff --git a/src/fccache.c b/src/fccache.c
index 611c0de..b858d7c 100644
--- a/src/fccache.c
+++ b/src/fccache.c
@@ -473,7 +473,7 @@ FcCacheFindByAddr (void *object)
 }
 
 static void
-FcCacheRemove (FcCache *cache)
+FcCacheRemoveUnlocked (FcCache *cache)
 {
     FcCacheSkip	    **update[FC_CACHE_MAX_LEVEL];
     FcCacheSkip	    *s, **next;
@@ -482,7 +482,6 @@ FcCacheRemove (FcCache *cache)
     /*
      * Find links along each chain
      */
-    lock_cache ();
     next = fcCacheChains;
     for (i = fcCacheMaxLevel; --i >= 0; )
     {
@@ -496,7 +495,6 @@ FcCacheRemove (FcCache *cache)
 	*update[i] = s->next[i];
     while (fcCacheMaxLevel > 0 && fcCacheChains[fcCacheMaxLevel - 1] == NULL)
 	fcCacheMaxLevel--;
-    unlock_cache ();
     free (s);
 }
 
@@ -520,8 +518,10 @@ FcCacheFindByStat (struct stat *cache_stat)
 }
 
 static void
-FcDirCacheDispose (FcCache *cache)
+FcDirCacheDisposeUnlocked (FcCache *cache)
 {
+    FcCacheRemoveUnlocked (cache);
+
     switch (cache->magic) {
     case FC_CACHE_MAGIC_ALLOC:
 	free (cache);
@@ -534,7 +534,6 @@ FcDirCacheDispose (FcCache *cache)
 #endif
 	break;
     }
-    FcCacheRemove (cache);
 }
 
 void
@@ -549,13 +548,16 @@ FcCacheObjectReference (void *object)
 void
 FcCacheObjectDereference (void *object)
 {
-    FcCacheSkip	*skip = FcCacheFindByAddr (object);
+    FcCacheSkip	*skip;
 
+    lock_cache ();
+    skip = FcCacheFindByAddrUnlocked (object);
     if (skip)
     {
 	if (FcRefDec (&skip->ref) <= 1)
-	    FcDirCacheDispose (skip->cache);
+	    FcDirCacheDisposeUnlocked (skip->cache);
     }
+    unlock_cache ();
 }
 
 void
@@ -1008,7 +1010,7 @@ FcDirCacheWrite (FcCache *cache, FcConfig *config)
     if (cache->size < FC_CACHE_MIN_MMAP && FcStat (cache_hashed, &cache_stat))
     {
 	lock_cache ();
-	if (skip = FcCacheFindByAddrUnlocked (cache))
+	if ((skip = FcCacheFindByAddrUnlocked (cache)))
 	{
 	    skip->cache_dev = cache_stat.st_dev;
 	    skip->cache_ino = cache_stat.st_ino;


More information about the Fontconfig mailing list