diff options
Diffstat (limited to 'JavaScriptCore/wtf/HashTable.h')
-rw-r--r-- | JavaScriptCore/wtf/HashTable.h | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/JavaScriptCore/wtf/HashTable.h b/JavaScriptCore/wtf/HashTable.h index 4c7790a..3b283f8 100644 --- a/JavaScriptCore/wtf/HashTable.h +++ b/JavaScriptCore/wtf/HashTable.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2008 David Levin <levin@chromium.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,6 +25,7 @@ #include "FastMalloc.h" #include "HashTraits.h" #include <wtf/Assertions.h> +#include <wtf/Threading.h> namespace WTF { @@ -42,13 +44,19 @@ namespace WTF { struct HashTableStats { ~HashTableStats(); + // All of the variables are accessed in ~HashTableStats when the static struct is destroyed. + + // The following variables are all atomically incremented when modified. static int numAccesses; - static int numCollisions; - static int collisionGraph[4096]; - static int maxCollisions; static int numRehashes; static int numRemoves; static int numReinserts; + + // The following variables are only modified in the recordCollisionAtCount method within a mutex. + static int maxCollisions; + static int numCollisions; + static int collisionGraph[4096]; + static void recordCollisionAtCount(int count); }; @@ -201,6 +209,8 @@ namespace WTF { #if CHECK_HASHTABLE_ITERATORS public: + // Any modifications of the m_next or m_previous of an iterator that is in a linked list of a HashTable::m_iterator, + // should be guarded with m_table->m_mutex. mutable const HashTableType* m_table; mutable const_iterator* m_next; mutable const_iterator* m_previous; @@ -397,7 +407,9 @@ namespace WTF { #if CHECK_HASHTABLE_ITERATORS public: + // All access to m_iterators should be guarded with m_mutex. mutable const_iterator* m_iterators; + mutable Mutex m_mutex; #endif }; @@ -466,7 +478,7 @@ namespace WTF { return 0; #if DUMP_HASHTABLE_STATS - ++HashTableStats::numAccesses; + atomicIncrement(&HashTableStats::numAccesses); int probeCount = 0; #endif @@ -511,7 +523,7 @@ namespace WTF { int i = h & sizeMask; #if DUMP_HASHTABLE_STATS - ++HashTableStats::numAccesses; + atomicIncrement(&HashTableStats::numAccesses); int probeCount = 0; #endif @@ -563,7 +575,7 @@ namespace WTF { int i = h & sizeMask; #if DUMP_HASHTABLE_STATS - ++HashTableStats::numAccesses; + atomicIncrement(&HashTableStats::numAccesses); int probeCount = 0; #endif @@ -623,7 +635,7 @@ namespace WTF { int i = h & sizeMask; #if DUMP_HASHTABLE_STATS - ++HashTableStats::numAccesses; + atomicIncrement(&HashTableStats::numAccesses); int probeCount = 0; #endif @@ -738,7 +750,7 @@ namespace WTF { ASSERT(!lookupForWriting(Extractor::extract(entry)).second); ASSERT(!isDeletedBucket(*(lookupForWriting(Extractor::extract(entry)).first))); #if DUMP_HASHTABLE_STATS - ++HashTableStats::numReinserts; + atomicIncrement(&HashTableStats::numReinserts); #endif Mover<ValueType, Traits::needsDestruction>::move(entry, *lookupForWriting(Extractor::extract(entry)).first); @@ -801,7 +813,7 @@ namespace WTF { void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::remove(ValueType* pos) { #if DUMP_HASHTABLE_STATS - ++HashTableStats::numRemoves; + atomicIncrement(&HashTableStats::numRemoves); #endif deleteBucket(*pos); @@ -887,7 +899,7 @@ namespace WTF { #if DUMP_HASHTABLE_STATS if (oldTableSize != 0) - ++HashTableStats::numRehashes; + atomicIncrement(&HashTableStats::numRehashes); #endif m_tableSize = newTableSize; @@ -1016,6 +1028,7 @@ namespace WTF { template<typename Key, typename Value, typename Extractor, typename HashFunctions, typename Traits, typename KeyTraits> void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::invalidateIterators() { + MutexLocker lock(m_mutex); const_iterator* next; for (const_iterator* p = m_iterators; p; p = next) { next = p->m_next; @@ -1037,6 +1050,7 @@ namespace WTF { if (!table) { it->m_next = 0; } else { + MutexLocker lock(table->m_mutex); ASSERT(table->m_iterators != it); it->m_next = table->m_iterators; table->m_iterators = it; @@ -1058,6 +1072,7 @@ namespace WTF { ASSERT(!it->m_next); ASSERT(!it->m_previous); } else { + MutexLocker lock(it->m_table->m_mutex); if (it->m_next) { ASSERT(it->m_next->m_previous == it); it->m_next->m_previous = it->m_previous; |