From: Behdad Esfahbod Date: Tue, 9 Oct 2012 00:02:05 +0000 (-0400) Subject: Add a big cache lock X-Git-Tag: 2.10.91~37 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=91dd7d28ffc397fb1389f76ac55b397e55da809d;p=platform%2Fupstream%2Ffontconfig.git Add a big cache lock Not used yet. --- diff --git a/src/fccache.c b/src/fccache.c index 1e9745a..14dcf32 100644 --- a/src/fccache.c +++ b/src/fccache.c @@ -307,6 +307,45 @@ FcRandom(void) return result; } + +static FcMutex *cache_lock; + +static void +lock_cache (void) +{ + FcMutex *lock; +retry: + lock = fc_atomic_ptr_get (&cache_lock); + if (!lock) { + lock = (FcMutex *) malloc (sizeof (FcMutex)); + FcMutexInit (lock); + if (!fc_atomic_ptr_cmpexch (&cache_lock, NULL, lock)) { + FcMutexFinish (lock); + goto retry; + } + } + FcMutexLock (lock); +} + +static void +unlock_cache (void) +{ + FcMutexUnlock (cache_lock); +} + +static void +free_lock (void) +{ + FcMutex *lock; + lock = fc_atomic_ptr_get (&cache_lock); + if (lock && fc_atomic_ptr_cmpexch (&cache_lock, lock, NULL)) { + FcMutexFinish (lock); + free (lock); + } +} + + + /* * Generate a random level number, distributed * so that each level is 1/4 as likely as the one before @@ -504,6 +543,8 @@ FcCacheFini (void) for (i = 0; i < FC_CACHE_MAX_LEVEL; i++) assert (fcCacheChains[i] == NULL); assert (fcCacheMaxLevel == 0); + + free_lock (); } static FcBool