Index: src/core/SkGlyphCache.cpp |
diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp |
index 6ae17b10741bc00204000daf1974137e3e5db967..ae268d517c93491702d2763b3ebd6d0ed18006cc 100755 |
--- a/src/core/SkGlyphCache.cpp |
+++ b/src/core/SkGlyphCache.cpp |
@@ -21,7 +21,7 @@ |
namespace { |
SkGlyphCache_Globals* create_globals() { |
- return SkNEW_ARGS(SkGlyphCache_Globals, (SkGlyphCache_Globals::kYes_UseMutex)); |
+ return SkNEW(SkGlyphCache_Globals); |
} |
} // namespace |
@@ -29,16 +29,10 @@ SkGlyphCache_Globals* create_globals() { |
SK_DECLARE_STATIC_LAZY_PTR(SkGlyphCache_Globals, globals, create_globals); |
// Returns the shared globals |
-static SkGlyphCache_Globals& getSharedGlobals() { |
+static SkGlyphCache_Globals& get_globals() { |
return *globals.get(); |
} |
-// Returns the TLS globals (if set), or the shared globals |
-static SkGlyphCache_Globals& getGlobals() { |
- SkGlyphCache_Globals* tls = SkGlyphCache_Globals::FindTLS(); |
- return tls ? *tls : getSharedGlobals(); |
-} |
- |
/////////////////////////////////////////////////////////////////////////////// |
#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS |
@@ -418,13 +412,22 @@ void SkGlyphCache::invokeAndRemoveAuxProcs() { |
/////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////// |
+ |
+class AutoAcquire { |
+public: |
+ AutoAcquire(SkSpinlock& lock) : fLock(lock) { fLock.acquire(); } |
+ ~AutoAcquire() { fLock.release(); } |
+private: |
+ SkSpinlock& fLock; |
+}; |
+ |
size_t SkGlyphCache_Globals::setCacheSizeLimit(size_t newLimit) { |
static const size_t minLimit = 256 * 1024; |
if (newLimit < minLimit) { |
newLimit = minLimit; |
} |
- SkAutoMutexAcquire ac(fMutex); |
+ AutoAcquire ac(fLock); |
size_t prevLimit = fCacheSizeLimit; |
fCacheSizeLimit = newLimit; |
@@ -437,7 +440,7 @@ int SkGlyphCache_Globals::setCacheCountLimit(int newCount) { |
newCount = 0; |
} |
- SkAutoMutexAcquire ac(fMutex); |
+ AutoAcquire ac(fLock); |
int prevCount = fCacheCountLimit; |
fCacheCountLimit = newCount; |
@@ -446,7 +449,7 @@ int SkGlyphCache_Globals::setCacheCountLimit(int newCount) { |
} |
void SkGlyphCache_Globals::purgeAll() { |
- SkAutoMutexAcquire ac(fMutex); |
+ AutoAcquire ac(fLock); |
this->internalPurge(fTotalMemoryUsed); |
} |
@@ -465,26 +468,26 @@ SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface, |
} |
SkASSERT(desc); |
- SkGlyphCache_Globals& globals = getGlobals(); |
- SkAutoMutexAcquire ac(globals.fMutex); |
+ SkGlyphCache_Globals& globals = get_globals(); |
SkGlyphCache* cache; |
- bool insideMutex = true; |
- globals.validate(); |
- |
- for (cache = globals.internalGetHead(); cache != NULL; cache = cache->fNext) { |
- if (cache->fDesc->equals(*desc)) { |
- globals.internalDetachCache(cache); |
- goto FOUND_IT; |
+ { |
+ AutoAcquire ac(globals.fLock); |
+ |
+ globals.validate(); |
+ |
+ for (cache = globals.internalGetHead(); cache != NULL; cache = cache->fNext) { |
+ if (cache->fDesc->equals(*desc)) { |
+ globals.internalDetachCache(cache); |
+ if (!proc(cache, context)) { |
+ globals.internalAttachCacheToHead(cache); |
+ cache = NULL; |
+ } |
+ return cache; |
+ } |
} |
} |
- /* Release the mutex now, before we create a new entry (which might have |
- side-effects like trying to access the cache/mutex (yikes!) |
- */ |
- ac.release(); // release the mutex now |
- insideMutex = false; // can't use globals anymore |
- |
// Check if we can create a scaler-context before creating the glyphcache. |
// If not, we may have exhausted OS/font resources, so try purging the |
// cache once and try again. |
@@ -493,23 +496,17 @@ SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface, |
// so we can try the purge. |
SkScalerContext* ctx = typeface->createScalerContext(desc, true); |
if (!ctx) { |
- getSharedGlobals().purgeAll(); |
+ get_globals().purgeAll(); |
ctx = typeface->createScalerContext(desc, false); |
SkASSERT(ctx); |
} |
cache = SkNEW_ARGS(SkGlyphCache, (typeface, desc, ctx)); |
} |
-FOUND_IT: |
- |
AutoValidate av(cache); |
if (!proc(cache, context)) { // need to reattach |
- if (insideMutex) { |
- globals.internalAttachCacheToHead(cache); |
- } else { |
- globals.attachCacheToHead(cache); |
- } |
+ globals.attachCacheToHead(cache); |
cache = NULL; |
} |
return cache; |
@@ -519,12 +516,12 @@ void SkGlyphCache::AttachCache(SkGlyphCache* cache) { |
SkASSERT(cache); |
SkASSERT(cache->fNext == NULL); |
- getGlobals().attachCacheToHead(cache); |
+ get_globals().attachCacheToHead(cache); |
} |
void SkGlyphCache::Dump() { |
- SkGlyphCache_Globals& globals = getGlobals(); |
- SkAutoMutexAcquire ac(globals.fMutex); |
+ SkGlyphCache_Globals& globals = get_globals(); |
+ AutoAcquire ac(globals.fLock); |
SkGlyphCache* cache; |
globals.validate(); |
@@ -552,7 +549,7 @@ void SkGlyphCache::Dump() { |
/////////////////////////////////////////////////////////////////////////////// |
void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) { |
- SkAutoMutexAcquire ac(fMutex); |
+ AutoAcquire ac(fLock); |
this->validate(); |
cache->validate(); |
@@ -681,8 +678,10 @@ void SkGlyphCache_Globals::validate() const { |
head = head->fNext; |
} |
- SkASSERT(fTotalMemoryUsed == computedBytes); |
- SkASSERT(fCacheCount == computedCount); |
+ SkASSERTF(fCacheCount == computedCount, "fCacheCount: %d, computedCount: %d", fCacheCount, |
+ computedCount); |
+ SkASSERTF(fTotalMemoryUsed == computedBytes, "fTotalMemoryUsed: %d, computedBytes: %d", |
+ fTotalMemoryUsed, computedBytes); |
} |
#endif |
@@ -693,43 +692,34 @@ void SkGlyphCache_Globals::validate() const { |
#include "SkTypefaceCache.h" |
size_t SkGraphics::GetFontCacheLimit() { |
- return getSharedGlobals().getCacheSizeLimit(); |
+ return get_globals().getCacheSizeLimit(); |
} |
size_t SkGraphics::SetFontCacheLimit(size_t bytes) { |
- return getSharedGlobals().setCacheSizeLimit(bytes); |
+ return get_globals().setCacheSizeLimit(bytes); |
} |
size_t SkGraphics::GetFontCacheUsed() { |
- return getSharedGlobals().getTotalMemoryUsed(); |
+ return get_globals().getTotalMemoryUsed(); |
} |
int SkGraphics::GetFontCacheCountLimit() { |
- return getSharedGlobals().getCacheCountLimit(); |
+ return get_globals().getCacheCountLimit(); |
} |
int SkGraphics::SetFontCacheCountLimit(int count) { |
- return getSharedGlobals().setCacheCountLimit(count); |
+ return get_globals().setCacheCountLimit(count); |
} |
int SkGraphics::GetFontCacheCountUsed() { |
- return getSharedGlobals().getCacheCountUsed(); |
+ return get_globals().getCacheCountUsed(); |
} |
void SkGraphics::PurgeFontCache() { |
- getSharedGlobals().purgeAll(); |
+ get_globals().purgeAll(); |
SkTypefaceCache::PurgeAll(); |
} |
-size_t SkGraphics::GetTLSFontCacheLimit() { |
- const SkGlyphCache_Globals* tls = SkGlyphCache_Globals::FindTLS(); |
- return tls ? tls->getCacheSizeLimit() : 0; |
-} |
- |
-void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { |
- if (0 == bytes) { |
- SkGlyphCache_Globals::DeleteTLS(); |
- } else { |
- SkGlyphCache_Globals::GetTLS().setCacheSizeLimit(bytes); |
- } |
-} |
+// TODO(herb): clean up TLS apis. |
+size_t SkGraphics::GetTLSFontCacheLimit() { return 0; } |
+void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { } |