diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
| commit | 41386e9cb918eed93b3f13648cbef387e371e451 (patch) | |
| tree | a97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/runtime/WeakGCMap.h | |
| parent | e15dd966d523731101f70ccf768bba12435a0208 (diff) | |
| download | WebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz | |
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/JavaScriptCore/runtime/WeakGCMap.h')
| -rw-r--r-- | Source/JavaScriptCore/runtime/WeakGCMap.h | 72 |
1 files changed, 45 insertions, 27 deletions
diff --git a/Source/JavaScriptCore/runtime/WeakGCMap.h b/Source/JavaScriptCore/runtime/WeakGCMap.h index 16d3d4400..d9c1fb63e 100644 --- a/Source/JavaScriptCore/runtime/WeakGCMap.h +++ b/Source/JavaScriptCore/runtime/WeakGCMap.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009, 2015 Apple Inc. All rights reserved. + * Copyright (C) 2009 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -37,7 +37,6 @@ namespace JSC { template<typename KeyArg, typename ValueArg, typename HashArg = typename DefaultHash<KeyArg>::Hash, typename KeyTraitsArg = HashTraits<KeyArg>> class WeakGCMap { - WTF_MAKE_FAST_ALLOCATED; typedef Weak<ValueArg> ValueType; typedef HashMap<KeyArg, ValueType, HashArg, KeyTraitsArg> HashMapType; @@ -47,8 +46,10 @@ public: typedef typename HashMapType::iterator iterator; typedef typename HashMapType::const_iterator const_iterator; - explicit WeakGCMap(VM&); - ~WeakGCMap(); + WeakGCMap() + : m_gcThreshold(minGCThreshold) + { + } ValueArg* get(const KeyType& key) const { @@ -57,7 +58,19 @@ public: AddResult set(const KeyType& key, ValueType value) { - return m_map.set(key, WTF::move(value)); + gcMapIfNeeded(); + return m_map.set(key, std::move(value)); + } + + AddResult add(const KeyType& key, ValueType value) + { + gcMapIfNeeded(); + AddResult addResult = m_map.add(key, nullptr); + if (!addResult.iterator->value) { // New value or found a zombie value. + addResult.isNewEntry = true; + addResult.iterator->value = std::move(value); + } + return addResult; } bool remove(const KeyType& key) @@ -70,17 +83,6 @@ public: m_map.clear(); } - bool isEmpty() const - { - const_iterator it = m_map.begin(); - const_iterator end = m_map.end(); - while (it != end) { - if (it->value) - return true; - } - return false; - } - iterator find(const KeyType& key) { iterator it = m_map.find(key); @@ -95,27 +97,43 @@ public: return const_cast<WeakGCMap*>(this)->find(key); } - template<typename Functor> - void forEach(Functor functor) + bool contains(const KeyType& key) const { - for (auto& pair : m_map) { - if (pair.value) - functor(pair.key, pair.value.get()); - } + return find(key) != m_map.end(); } - bool contains(const KeyType& key) const +private: + static const int minGCThreshold = 3; + + void gcMap() { - return find(key) != m_map.end(); + Vector<KeyType, 4> zombies; + + for (iterator it = m_map.begin(), end = m_map.end(); it != end; ++it) { + if (!it->value) + zombies.append(it->key); + } + + for (size_t i = 0; i < zombies.size(); ++i) + m_map.remove(zombies[i]); } - void pruneStaleEntries(); + void gcMapIfNeeded() + { + if (m_map.size() < m_gcThreshold) + return; + + gcMap(); + m_gcThreshold = std::max(minGCThreshold, m_map.size() * 2 - 1); + } -private: HashMapType m_map; - VM& m_vm; + int m_gcThreshold; }; +template<typename KeyArg, typename RawMappedArg, typename HashArg, typename KeyTraitsArg> +const int WeakGCMap<KeyArg, RawMappedArg, HashArg, KeyTraitsArg>::minGCThreshold; + } // namespace JSC #endif // WeakGCMap_h |
