Skip to content

Commit 659cc1c

Browse files
herbderbySkia Commit-Bot
authored andcommitted
Make the strike cache hash table own the strike
Make the ownership explicit by using the hash table. Change-Id: I3e1520091e755010c71a9b497af62a64636dc5bd Reviewed-on: https://skia-review.googlesource.com/c/skia/+/272722 Reviewed-by: Ben Wagner <[email protected]> Commit-Queue: Herb Derby <[email protected]>
1 parent 251ee1d commit 659cc1c

File tree

2 files changed

+27
-35
lines changed

2 files changed

+27
-35
lines changed

src/core/SkStrikeCache.cpp

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
8980
SkExclusiveStrikePtr 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

187178
auto 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

205199
SkExclusiveStrikePtr SkStrikeCache::createStrikeExclusive(
@@ -359,23 +353,24 @@ size_t SkStrikeCache::internalPurge(size_t minBytesNeeded) {
359353
}
360354

361355
void 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

381376
void 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

403397
void 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");

src/core/SkStrikeCache.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ class SkStrikePinner {
4141
class SkStrikeCache final : public SkStrikeForGPUCacheInterface {
4242
public:
4343
SkStrikeCache() = default;
44-
~SkStrikeCache() override;
4544

4645
class Strike final : public SkRefCnt, public SkStrikeForGPU {
4746
public:
@@ -237,14 +236,14 @@ class SkStrikeCache final : public SkStrikeForGPUCacheInterface {
237236
Strike* fHead SK_GUARDED_BY(fLock) {nullptr};
238237
Strike* fTail SK_GUARDED_BY(fLock) {nullptr};
239238
struct StrikeTraits {
240-
static const SkDescriptor& GetKey(const Strike* strike) {
239+
static const SkDescriptor& GetKey(const sk_sp<Strike>& strike) {
241240
return strike->getDescriptor();
242241
}
243242
static uint32_t Hash(const SkDescriptor& descriptor) {
244243
return descriptor.getChecksum();
245244
}
246245
};
247-
SkTHashTable<Strike*, SkDescriptor, StrikeTraits> fStrikeLookup SK_GUARDED_BY(fLock);
246+
SkTHashTable<sk_sp<Strike>, SkDescriptor, StrikeTraits> fStrikeLookup SK_GUARDED_BY(fLock);
248247

249248
size_t fCacheSizeLimit{SK_DEFAULT_FONT_CACHE_LIMIT};
250249
size_t fTotalMemoryUsed SK_GUARDED_BY(fLock) {0};

0 commit comments

Comments
 (0)