Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: Source/wtf/HashTable.h

Issue 189543014: Ensure proper finalization of garbage-collected types. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase and sign error in Vector Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/Supplementable.h ('k') | Source/wtf/Vector.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 bool isNewEntry; 211 bool isNewEntry;
212 }; 212 };
213 213
214 template<typename Value, typename Extractor, typename KeyTraits> 214 template<typename Value, typename Extractor, typename KeyTraits>
215 struct HashTableHelper { 215 struct HashTableHelper {
216 static bool isEmptyBucket(const Value& value) { return isHashTraitsEmpty Value<KeyTraits>(Extractor::extract(value)); } 216 static bool isEmptyBucket(const Value& value) { return isHashTraitsEmpty Value<KeyTraits>(Extractor::extract(value)); }
217 static bool isDeletedBucket(const Value& value) { return KeyTraits::isDe letedValue(Extractor::extract(value)); } 217 static bool isDeletedBucket(const Value& value) { return KeyTraits::isDe letedValue(Extractor::extract(value)); }
218 static bool isEmptyOrDeletedBucket(const Value& value) { return isEmptyB ucket(value) || isDeletedBucket(value); } 218 static bool isEmptyOrDeletedBucket(const Value& value) { return isEmptyB ucket(value) || isDeletedBucket(value); }
219 }; 219 };
220 220
221 // Don't declare a destructor for HeapAllocated hash tables.
222 template<typename Derived, bool isGarbageCollected>
223 class HashTableDestructorBase;
224
225 template<typename Derived>
226 class HashTableDestructorBase<Derived, true> { };
227
228 template<typename Derived>
229 class HashTableDestructorBase<Derived, false> {
230 public:
231 ~HashTableDestructorBase() { static_cast<Derived*>(this)->finalize(); }
232 };
233
221 template<typename Key, typename Value, typename Extractor, typename HashFunc tions, typename Traits, typename KeyTraits, typename Allocator> 234 template<typename Key, typename Value, typename Extractor, typename HashFunc tions, typename Traits, typename KeyTraits, typename Allocator>
222 class HashTable { 235 class HashTable : public HashTableDestructorBase<HashTable<Key, Value, Extra ctor, HashFunctions, Traits, KeyTraits, Allocator>, Allocator::isGarbageCollecte d> {
223 public: 236 public:
224 typedef HashTableIterator<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allocator> iterator; 237 typedef HashTableIterator<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, Allocator> iterator;
225 typedef HashTableConstIterator<Key, Value, Extractor, HashFunctions, Tra its, KeyTraits, Allocator> const_iterator; 238 typedef HashTableConstIterator<Key, Value, Extractor, HashFunctions, Tra its, KeyTraits, Allocator> const_iterator;
226 typedef Traits ValueTraits; 239 typedef Traits ValueTraits;
227 typedef Key KeyType; 240 typedef Key KeyType;
228 typedef typename KeyTraits::PeekInType KeyPeekInType; 241 typedef typename KeyTraits::PeekInType KeyPeekInType;
229 typedef typename KeyTraits::PassInType KeyPassInType; 242 typedef typename KeyTraits::PassInType KeyPassInType;
230 typedef Value ValueType; 243 typedef Value ValueType;
231 typedef typename Traits::PeekInType ValuePeekInType; 244 typedef typename Traits::PeekInType ValuePeekInType;
232 typedef IdentityHashTranslator<HashFunctions> IdentityTranslatorType; 245 typedef IdentityHashTranslator<HashFunctions> IdentityTranslatorType;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 for (int i = 1; i <= maxCollisions; i++) { 284 for (int i = 1; i <= maxCollisions; i++) {
272 dataLogF(" %d lookups with exactly %d collisions (%.2f%% , %.2f%% with this many or more)\n", collisionGraph[i], i, 100.0 * (collisionGraph [i] - collisionGraph[i+1]) / numAccesses, 100.0 * collisionGraph[i] / numAccesse s); 285 dataLogF(" %d lookups with exactly %d collisions (%.2f%% , %.2f%% with this many or more)\n", collisionGraph[i], i, 100.0 * (collisionGraph [i] - collisionGraph[i+1]) / numAccesses, 100.0 * collisionGraph[i] / numAccesse s);
273 } 286 }
274 dataLogF("%d rehashes\n", numRehashes); 287 dataLogF("%d rehashes\n", numRehashes);
275 dataLogF("%d reinserts\n", numReinserts); 288 dataLogF("%d reinserts\n", numReinserts);
276 } 289 }
277 }; 290 };
278 #endif 291 #endif
279 292
280 HashTable(); 293 HashTable();
281 ~HashTable() 294 void finalize()
282 { 295 {
283 if (Allocator::isGarbageCollected) 296 ASSERT(!Allocator::isGarbageCollected);
284 return;
285 if (LIKELY(!m_table)) 297 if (LIKELY(!m_table))
286 return; 298 return;
287 deallocateTable(m_table, m_tableSize); 299 deallocateTable(m_table, m_tableSize);
288 m_table = 0; 300 m_table = 0;
289 } 301 }
290 302
291 HashTable(const HashTable&); 303 HashTable(const HashTable&);
292 void swap(HashTable&); 304 void swap(HashTable&);
293 HashTable& operator=(const HashTable&); 305 HashTable& operator=(const HashTable&);
294 306
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 inline bool operator!=(const HashTableIteratorAdapter<T, U>& a, const HashTa bleConstIteratorAdapter<T, U>& b) 1180 inline bool operator!=(const HashTableIteratorAdapter<T, U>& a, const HashTa bleConstIteratorAdapter<T, U>& b)
1169 { 1181 {
1170 return a.m_impl != b.m_impl; 1182 return a.m_impl != b.m_impl;
1171 } 1183 }
1172 1184
1173 } // namespace WTF 1185 } // namespace WTF
1174 1186
1175 #include "wtf/HashIterators.h" 1187 #include "wtf/HashIterators.h"
1176 1188
1177 #endif // WTF_HashTable_h 1189 #endif // WTF_HashTable_h
OLDNEW
« no previous file with comments | « Source/platform/Supplementable.h ('k') | Source/wtf/Vector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698