summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/WeakGCMap.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
commit41386e9cb918eed93b3f13648cbef387e371e451 (patch)
treea97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/runtime/WeakGCMap.h
parente15dd966d523731101f70ccf768bba12435a0208 (diff)
downloadWebKitGtk-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.h72
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