Correct a possible free after use.

This shows up in TSAN runs as a use-after-free warning.

BUG=skia:

Review URL: https://codereview.chromium.org/1333003002
This commit is contained in:
herb 2015-09-10 14:16:12 -07:00 committed by Commit bot
parent a1c0ee4004
commit 83e599a7ab
2 changed files with 4 additions and 9 deletions

View File

@ -428,12 +428,10 @@ SkGlyphCache* SkGlyphCache::VisitCache(
} }
cache = new SkGlyphCache(typeface, desc, ctx); cache = new SkGlyphCache(typeface, desc, ctx);
globals.attachCacheToHead(cache);
} }
AutoValidate av(cache);
AutoAcquire ac(globals.fLock); AutoAcquire ac(globals.fLock);
globals.internalAttachCacheToHead(cache);
cache->fMapMutex.acquireShared(); cache->fMapMutex.acquireShared();
if (!proc(cache, context)) { // need to reattach if (!proc(cache, context)) { // need to reattach
@ -534,9 +532,8 @@ void SkGlyphCache::VisitAll(Visitor visitor, void* context) {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) { void SkGlyphCache_Globals::internalAttachCacheToHead(SkGlyphCache* cache) {
AutoAcquire ac(fLock); this->internalPurge();
fCacheCount += 1; fCacheCount += 1;
cache->fRefCount += 1; cache->fRefCount += 1;
// Access to cache->fMemoryUsed is single threaded until internalMoveToHead. // Access to cache->fMemoryUsed is single threaded until internalMoveToHead.
@ -546,8 +543,6 @@ void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) {
this->validate(); this->validate();
cache->validate(); cache->validate();
this->internalPurge();
} }
SkGlyphCache* SkGlyphCache_Globals::internalGetTail() const { SkGlyphCache* SkGlyphCache_Globals::internalGetTail() const {

View File

@ -74,7 +74,7 @@ public:
void purgeAll(); // does not change budget void purgeAll(); // does not change budget
// call when a glyphcache is available for caching (i.e. not in use) // call when a glyphcache is available for caching (i.e. not in use)
void attachCacheToHead(SkGlyphCache*); void internalAttachCacheToHead(SkGlyphCache*);
// can only be called when the mutex is already held // can only be called when the mutex is already held
void internalMoveToHead(SkGlyphCache *); void internalMoveToHead(SkGlyphCache *);