@@ -77,15 +77,6 @@ bool operator == (decltype(nullptr), const SkStrikeCache::ExclusiveStrikePtr& rh
7777 return nullptr == rhs.fStrike ;
7878}
7979
80- SkStrikeCache::~SkStrikeCache () {
81- Strike* strike = fHead ;
82- while (strike) {
83- Strike* next = strike->fNext ;
84- strike->unref ();
85- strike = next;
86- }
87- }
88-
8980SkExclusiveStrikePtr SkStrikeCache::findOrCreateStrikeExclusive (
9081 const SkDescriptor& desc, const SkScalerContextEffects& effects, const SkTypeface& typeface)
9182{
@@ -185,21 +176,24 @@ SkExclusiveStrikePtr SkStrikeCache::findStrikeExclusive(const SkDescriptor& desc
185176}
186177
187178auto SkStrikeCache::internalFindStrikeOrNull (const SkDescriptor& desc) -> sk_sp<Strike> {
188- Strike* strike = fStrikeLookup .findOrNull (desc);
189- if (strike != nullptr && fHead != strike) {
179+ sk_sp<Strike>* strikeHandle = fStrikeLookup .find (desc);
180+ if (strikeHandle == nullptr ) { return nullptr ; }
181+ Strike* strikePtr = strikeHandle->get ();
182+ SkASSERT (strikePtr != nullptr );
183+ if (fHead != strikePtr) {
190184 // Make most recently used
191- strike ->fPrev ->fNext = strike ->fNext ;
192- if (strike ->fNext != nullptr ) {
193- strike ->fNext ->fPrev = strike ->fPrev ;
185+ strikePtr ->fPrev ->fNext = strikePtr ->fNext ;
186+ if (strikePtr ->fNext != nullptr ) {
187+ strikePtr ->fNext ->fPrev = strikePtr ->fPrev ;
194188 } else {
195- fTail = strike ->fPrev ;
189+ fTail = strikePtr ->fPrev ;
196190 }
197- fHead ->fPrev = strike ;
198- strike ->fNext = fHead ;
199- strike ->fPrev = nullptr ;
200- fHead = strike ;
191+ fHead ->fPrev = strikePtr ;
192+ strikePtr ->fNext = fHead ;
193+ strikePtr ->fPrev = nullptr ;
194+ fHead = strikePtr ;
201195 }
202- return sk_ref_sp (strike );
196+ return sk_ref_sp (strikePtr );
203197}
204198
205199SkExclusiveStrikePtr SkStrikeCache::createStrikeExclusive (
@@ -359,23 +353,24 @@ size_t SkStrikeCache::internalPurge(size_t minBytesNeeded) {
359353}
360354
361355void SkStrikeCache::internalAttachToHead (sk_sp<Strike> strike) {
362- SkASSERT (nullptr == strike->fPrev && nullptr == strike->fNext );
356+ SkASSERT (fStrikeLookup .find (strike->getDescriptor ()) == nullptr );
357+ Strike* strikePtr = strike.get ();
358+ fStrikeLookup .set (std::move (strike));
359+ SkASSERT (nullptr == strikePtr->fPrev && nullptr == strikePtr->fNext );
363360
364361 fCacheCount += 1 ;
365- fTotalMemoryUsed += strike ->fMemoryUsed ;
362+ fTotalMemoryUsed += strikePtr ->fMemoryUsed ;
366363
367- if (fHead ) {
368- fHead ->fPrev = strike. get () ;
369- strike ->fNext = fHead ;
364+ if (fHead != nullptr ) {
365+ fHead ->fPrev = strikePtr ;
366+ strikePtr ->fNext = fHead ;
370367 }
371368
372369 if (fTail == nullptr ) {
373- fTail = strike. get () ;
370+ fTail = strikePtr ;
374371 }
375372
376- fStrikeLookup .set (strike.get ());
377-
378- fHead = strike.release (); // Transfer ownership of strike to the cache list.
373+ fHead = strikePtr; // Transfer ownership of strike to the cache list.
379374}
380375
381376void SkStrikeCache::internalRemoveStrike (Strike* strike) {
@@ -394,10 +389,9 @@ void SkStrikeCache::internalRemoveStrike(Strike* strike) {
394389 fTail = strike->fPrev ;
395390 }
396391
397- fStrikeLookup .remove (strike->getDescriptor ());
398392 strike->fPrev = strike->fNext = nullptr ;
399393 strike->fRemoved = true ;
400- strike->unref ( );
394+ fStrikeLookup . remove ( strike->getDescriptor () );
401395}
402396
403397void SkStrikeCache::validate () const {
@@ -413,7 +407,6 @@ void SkStrikeCache::validate() const {
413407 strike = strike->fNext ;
414408 }
415409
416- // Can't use SkASSERTF because it looses thread annotations.
417410 if (fCacheCount != computedCount) {
418411 SkDebugf (" fCacheCount: %d, computedCount: %d" , fCacheCount , computedCount);
419412 SK_ABORT (" fCacheCount != computedCount" );
0 commit comments