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

Side by Side Diff: src/base/hashmap.h

Issue 2488423003: [base] Probe hashmap using indices rather than pointers (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // The reason we write our own hash map instead of using unordered_map in STL, 5 // The reason we write our own hash map instead of using unordered_map in STL,
6 // is that STL containers use a mutex pool on debug build, which will lead to 6 // is that STL containers use a mutex pool on debug build, which will lead to
7 // deadlock when we are using async signal handler. 7 // deadlock when we are using async signal handler.
8 8
9 #ifndef V8_BASE_HASHMAP_H_ 9 #ifndef V8_BASE_HASHMAP_H_
10 #define V8_BASE_HASHMAP_H_ 10 #define V8_BASE_HASHMAP_H_
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 // Clear the entry which is allowed to en emptied. 222 // Clear the entry which is allowed to en emptied.
223 p->clear(); 223 p->clear();
224 occupancy_--; 224 occupancy_--;
225 return value; 225 return value;
226 } 226 }
227 227
228 template <typename Key, typename Value, typename MatchFun, 228 template <typename Key, typename Value, typename MatchFun,
229 class AllocationPolicy> 229 class AllocationPolicy>
230 void TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Clear() { 230 void TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Clear() {
231 // Mark all entries as empty. 231 // Mark all entries as empty.
232 const Entry* end = map_end(); 232 for (size_t i = 0; i < capacity_; ++i) {
233 for (Entry* entry = map_; entry < end; entry++) { 233 map_[i].clear();
234 entry->clear();
235 } 234 }
236 occupancy_ = 0; 235 occupancy_ = 0;
237 } 236 }
238 237
239 template <typename Key, typename Value, typename MatchFun, 238 template <typename Key, typename Value, typename MatchFun,
240 class AllocationPolicy> 239 class AllocationPolicy>
241 typename TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Entry* 240 typename TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Entry*
242 TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Start() const { 241 TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Start() const {
243 return Next(map_ - 1); 242 return Next(map_ - 1);
244 } 243 }
(...skipping 12 matching lines...) Expand all
257 } 256 }
258 return nullptr; 257 return nullptr;
259 } 258 }
260 259
261 template <typename Key, typename Value, typename MatchFun, 260 template <typename Key, typename Value, typename MatchFun,
262 class AllocationPolicy> 261 class AllocationPolicy>
263 typename TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Entry* 262 typename TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Entry*
264 TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Probe( 263 TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Probe(
265 const Key& key, uint32_t hash) const { 264 const Key& key, uint32_t hash) const {
266 DCHECK(base::bits::IsPowerOfTwo32(capacity_)); 265 DCHECK(base::bits::IsPowerOfTwo32(capacity_));
267 Entry* entry = map_ + (hash & (capacity_ - 1)); 266 size_t i = hash & (capacity_ - 1);
268 const Entry* end = map_end(); 267 DCHECK(i < capacity_);
269 DCHECK(map_ <= entry && entry < end);
270 268
271 DCHECK(occupancy_ < capacity_); // Guarantees loop termination. 269 DCHECK(occupancy_ < capacity_); // Guarantees loop termination.
272 while (entry->exists() && !match_(hash, entry->hash, key, entry->key)) { 270 while (map_[i].exists() && !match_(hash, map_[i].hash, key, map_[i].key)) {
273 entry++; 271 i = (i + 1) & (capacity_ - 1);
274 if (entry >= end) {
275 entry = map_;
276 }
277 } 272 }
278 273
279 return entry; 274 return &map_[i];
280 } 275 }
281 276
282 template <typename Key, typename Value, typename MatchFun, 277 template <typename Key, typename Value, typename MatchFun,
283 class AllocationPolicy> 278 class AllocationPolicy>
284 typename TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Entry* 279 typename TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Entry*
285 TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::FillEmptyEntry( 280 TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::FillEmptyEntry(
286 Entry* entry, const Key& key, const Value& value, uint32_t hash, 281 Entry* entry, const Key& key, const Value& value, uint32_t hash,
287 AllocationPolicy allocator) { 282 AllocationPolicy allocator) {
288 DCHECK(!entry->exists()); 283 DCHECK(!entry->exists());
289 284
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 return Iterator(this, this->LookupOrInsert(key, key->Hash(), allocator)); 450 return Iterator(this, this->LookupOrInsert(key, key->Hash(), allocator));
456 } 451 }
457 return Iterator(this, this->Lookup(key, key->Hash())); 452 return Iterator(this, this->Lookup(key, key->Hash()));
458 } 453 }
459 }; 454 };
460 455
461 } // namespace base 456 } // namespace base
462 } // namespace v8 457 } // namespace v8
463 458
464 #endif // V8_BASE_HASHMAP_H_ 459 #endif // V8_BASE_HASHMAP_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698