aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2016-12-13 16:26:32 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-15 19:07:39 +0000
commite4bf164225cc6d027566e9bfa0c8492629a6e090 (patch)
tree9f6534d98e1ef26149b34cee8017ecde21fde525 /src
parent5adaf8bf24e7581104c41c868188602624e8ba86 (diff)
Port SkResourceCache to SkTHashTable
We'd like to fix bugs and make performance improvements to our hash tables. It's a lot easier if we can focus on one implementation, so I'd like to move users of SkTDynamicHash to SkTHashTable, SkTHashMap, or SkTHashSet. This is roughly outlined in the attached Skia bug. In this case, the conversion from SkTDynamicHash to SkTHashTable is pretty trivial. The main change is that the values stored in the table are no longer assumed to be pointers, so we just need to sprinkle in a couple of * and ->. SkResourceCache is particularly interesting as the locus of the attached Chromium bug. Porting this now means SkResourceCache will get any fixes we make as soon as we make them. BUG=skia:6053,chromium:429375 Change-Id: If5dc8d331c62f1d4449fb8f9a7f7e9c746070213 Reviewed-on: https://skia-review.googlesource.com/5984 Reviewed-by: Herb Derby <herb@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/core/SkResourceCache.cpp22
-rw-r--r--src/core/SkResourceCache.h4
2 files changed, 15 insertions, 11 deletions
diff --git a/src/core/SkResourceCache.cpp b/src/core/SkResourceCache.cpp
index 47d9f6a48f..e7c2f94bd5 100644
--- a/src/core/SkResourceCache.cpp
+++ b/src/core/SkResourceCache.cpp
@@ -51,10 +51,19 @@ void SkResourceCache::Key::init(void* nameSpace, uint64_t sharedID, size_t dataS
(fCount32 - kUnhashedLocal32s) << 2);
}
-#include "SkTDynamicHash.h"
+#include "SkTHash.h"
+
+namespace {
+ struct HashTraits {
+ static uint32_t Hash(const SkResourceCache::Key& key) { return key.hash(); }
+ static const SkResourceCache::Key& GetKey(const SkResourceCache::Rec* rec) {
+ return rec->getKey();
+ }
+ };
+}
class SkResourceCache::Hash :
- public SkTDynamicHash<SkResourceCache::Rec, SkResourceCache::Key> {};
+ public SkTHashTable<SkResourceCache::Rec*, SkResourceCache::Key, HashTraits> {};
///////////////////////////////////////////////////////////////////////////////
@@ -224,8 +233,8 @@ SkResourceCache::~SkResourceCache() {
bool SkResourceCache::find(const Key& key, FindVisitor visitor, void* context) {
this->checkMessages();
- Rec* rec = fHash->find(key);
- if (rec) {
+ if (auto found = fHash->find(key)) {
+ Rec* rec = *found;
if (visitor(*rec, context)) {
this->moveToHead(rec); // for our LRU
return true;
@@ -254,14 +263,13 @@ void SkResourceCache::add(Rec* rec) {
SkASSERT(rec);
// See if we already have this key (racy inserts, etc.)
- Rec* existing = fHash->find(rec->getKey());
- if (existing) {
+ if (nullptr != fHash->find(rec->getKey())) {
delete rec;
return;
}
this->addToHead(rec);
- fHash->add(rec);
+ fHash->set(rec);
if (gDumpCacheTransactions) {
SkString bytesStr, totalStr;
diff --git a/src/core/SkResourceCache.h b/src/core/SkResourceCache.h
index 5919336312..0ff627196e 100644
--- a/src/core/SkResourceCache.h
+++ b/src/core/SkResourceCache.h
@@ -86,10 +86,6 @@ public:
virtual const char* getCategory() const = 0;
virtual SkDiscardableMemory* diagnostic_only_getDiscardable() const { return nullptr; }
- // for SkTDynamicHash::Traits
- static uint32_t Hash(const Key& key) { return key.hash(); }
- static const Key& GetKey(const Rec& rec) { return rec.getKey(); }
-
private:
Rec* fNext;
Rec* fPrev;