| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights reserv
ed. |
| 3 * Copyright (C) 2008 David Levin <levin@chromium.org> | 3 * Copyright (C) 2008 David Levin <levin@chromium.org> |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 | 1194 |
| 1195 template<typename Key, typename Value, typename Extractor, typename HashFunc
tions, typename Traits, typename KeyTraits, typename Allocator> | 1195 template<typename Key, typename Value, typename Extractor, typename HashFunc
tions, typename Traits, typename KeyTraits, typename Allocator> |
| 1196 struct WeakProcessingHashTableHelper<true, Key, Value, Extractor, HashFuncti
ons, Traits, KeyTraits, Allocator> { | 1196 struct WeakProcessingHashTableHelper<true, Key, Value, Extractor, HashFuncti
ons, Traits, KeyTraits, Allocator> { |
| 1197 static void process(typename Allocator::Visitor* visitor, void* closure) | 1197 static void process(typename Allocator::Visitor* visitor, void* closure) |
| 1198 { | 1198 { |
| 1199 typedef HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyT
raits, Allocator> HashTableType; | 1199 typedef HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyT
raits, Allocator> HashTableType; |
| 1200 HashTableType* table = reinterpret_cast<HashTableType*>(closure); | 1200 HashTableType* table = reinterpret_cast<HashTableType*>(closure); |
| 1201 if (table->m_table) { | 1201 if (table->m_table) { |
| 1202 // This just marks it live and does not push anything onto the | 1202 // This just marks it live and does not push anything onto the |
| 1203 // marking stack because there is no trace for void*. | 1203 // marking stack because there is no trace for void*. |
| 1204 Allocator::visitWith(visitor, reinterpret_cast<void*>(table->m_t
able)); | 1204 Allocator::adjustAndMark(visitor, reinterpret_cast<void*>(table-
>m_table)); |
| 1205 // Now perform weak processing (this is a no-op if the backing | 1205 // Now perform weak processing (this is a no-op if the backing |
| 1206 // was accessible through an iterator and was already marked | 1206 // was accessible through an iterator and was already marked |
| 1207 // strongly). | 1207 // strongly). |
| 1208 for (typename HashTableType::ValueType* element = table->m_table
+ table->m_tableSize - 1; element >= table->m_table; element--) { | 1208 for (typename HashTableType::ValueType* element = table->m_table
+ table->m_tableSize - 1; element >= table->m_table; element--) { |
| 1209 if (!HashTableType::isEmptyOrDeletedBucket(*element)) { | 1209 if (!HashTableType::isEmptyOrDeletedBucket(*element)) { |
| 1210 if (Allocator::hasDeadMember(visitor, *element)) { | 1210 if (Allocator::hasDeadMember(visitor, *element)) { |
| 1211 HashTableType::deleteBucket(*element); // Also calls
the destructor. | 1211 HashTableType::deleteBucket(*element); // Also calls
the destructor. |
| 1212 table->m_deletedCount++; | 1212 table->m_deletedCount++; |
| 1213 table->m_keyCount--; | 1213 table->m_keyCount--; |
| 1214 // We don't rehash the backing until the next add | 1214 // We don't rehash the backing until the next add |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1328 return *this; | 1328 return *this; |
| 1329 } | 1329 } |
| 1330 | 1330 |
| 1331 template<typename Key, typename Value, typename Extractor, typename HashFunc
tions, typename Traits, typename KeyTraits, typename Allocator> | 1331 template<typename Key, typename Value, typename Extractor, typename HashFunc
tions, typename Traits, typename KeyTraits, typename Allocator> |
| 1332 void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allo
cator>::trace(typename Allocator::Visitor* visitor) | 1332 void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allo
cator>::trace(typename Allocator::Visitor* visitor) |
| 1333 { | 1333 { |
| 1334 // If someone else already marked the backing and queued up the trace | 1334 // If someone else already marked the backing and queued up the trace |
| 1335 // and/or weak callback then we are done. | 1335 // and/or weak callback then we are done. |
| 1336 if (!m_table || visitor->isAlive(m_table)) | 1336 if (!m_table || visitor->isAlive(m_table)) |
| 1337 return; | 1337 return; |
| 1338 // Normally, we visit the backing store cast to a void pointer. This | 1338 // Normally, we mark the backing store cast to a void pointer. This |
| 1339 // means it is marked live, but the pointers inside it are not visited. | 1339 // means it is marked live, but the pointers inside it are not marked. |
| 1340 // Instead we will visit the pointers below. However, for backing | 1340 // Instead we will mark the pointers below. However, for backing |
| 1341 // stores that contain weak pointers the handling is rather different. | 1341 // stores that contain weak pointers the handling is rather different. |
| 1342 // We don't visit the backing store here, so the marking GC will leave | 1342 // We don't mark the backing store here, so the marking GC will leave |
| 1343 // the backing unmarked. If the backing is found in any other way than | 1343 // the backing unmarked. If the backing is found in any other way than |
| 1344 // through its HashTable (ie from an iterator) then the mark bit will | 1344 // through its HashTable (ie from an iterator) then the mark bit will |
| 1345 // be set and the pointers will be visited strongly, avoiding problems | 1345 // be set and the pointers will be marked strongly, avoiding problems |
| 1346 // with iterating over things that disappear due to weak processing | 1346 // with iterating over things that disappear due to weak processing |
| 1347 // while we are iterating over them. The weakProcessing callback will | 1347 // while we are iterating over them. The weakProcessing callback will |
| 1348 // visit the backing as a void pointer, marking it live and will | 1348 // mark the backing as a void pointer, and will perform weak processing |
| 1349 // perform weak processing if needed. | 1349 // if needed. |
| 1350 if (!Traits::isWeak) | 1350 if (!Traits::isWeak) |
| 1351 Allocator::visitWith(visitor, reinterpret_cast<void*>(m_table)); | 1351 Allocator::adjustAndMark(visitor, reinterpret_cast<void*>(m_table)); |
| 1352 else | 1352 else |
| 1353 Allocator::registerWeakPointers(visitor, this, WeakProcessingHashTab
leHelper<Traits::isWeak, Key, Value, Extractor, HashFunctions, Traits, KeyTraits
, Allocator>::process); | 1353 Allocator::registerWeakPointers(visitor, this, WeakProcessingHashTab
leHelper<Traits::isWeak, Key, Value, Extractor, HashFunctions, Traits, KeyTraits
, Allocator>::process); |
| 1354 if (Traits::needsVisiting) { | 1354 if (Traits::needsTracing) { |
| 1355 for (ValueType* element = m_table + m_tableSize - 1; element >= m_ta
ble; element--) { | 1355 for (ValueType* element = m_table + m_tableSize - 1; element >= m_ta
ble; element--) { |
| 1356 if (!isEmptyOrDeletedBucket(*element)) | 1356 if (!isEmptyOrDeletedBucket(*element)) |
| 1357 Allocator::template visitWith<ValueType, Traits>(visitor, *e
lement); | 1357 Allocator::template adjustAndMark<ValueType, Traits>(visitor
, *element); |
| 1358 } | 1358 } |
| 1359 } | 1359 } |
| 1360 } | 1360 } |
| 1361 | 1361 |
| 1362 #if !ASSERT_DISABLED | 1362 #if !ASSERT_DISABLED |
| 1363 | 1363 |
| 1364 template<typename Key, typename Value, typename Extractor, typename HashFunc
tions, typename Traits, typename KeyTraits, typename Allocator> | 1364 template<typename Key, typename Value, typename Extractor, typename HashFunc
tions, typename Traits, typename KeyTraits, typename Allocator> |
| 1365 void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allo
cator>::checkTableConsistency() const | 1365 void HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allo
cator>::checkTableConsistency() const |
| 1366 { | 1366 { |
| 1367 checkTableConsistencyExceptSize(); | 1367 checkTableConsistencyExceptSize(); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1563 inline bool operator!=(const HashTableIteratorAdapter<T, U>& a, const HashTa
bleConstIteratorAdapter<T, U>& b) | 1563 inline bool operator!=(const HashTableIteratorAdapter<T, U>& a, const HashTa
bleConstIteratorAdapter<T, U>& b) |
| 1564 { | 1564 { |
| 1565 return a.m_impl != b.m_impl; | 1565 return a.m_impl != b.m_impl; |
| 1566 } | 1566 } |
| 1567 | 1567 |
| 1568 } // namespace WTF | 1568 } // namespace WTF |
| 1569 | 1569 |
| 1570 #include <wtf/HashIterators.h> | 1570 #include <wtf/HashIterators.h> |
| 1571 | 1571 |
| 1572 #endif // WTF_HashTable_h | 1572 #endif // WTF_HashTable_h |
| OLD | NEW |