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

Unified Diff: src/base/hashmap.h

Issue 2010243003: Move hashmap into base/. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ast/scopes.h ('k') | src/bootstrapper.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/base/hashmap.h
diff --git a/src/hashmap.h b/src/base/hashmap.h
similarity index 84%
rename from src/hashmap.h
rename to src/base/hashmap.h
index f94def7c3c7a04cb4c0e534074c4f94b092a0f81..470bf616fdba962cc65b9abc66099107e0a543f8 100644
--- a/src/hashmap.h
+++ b/src/base/hashmap.h
@@ -2,21 +2,29 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef V8_HASHMAP_H_
-#define V8_HASHMAP_H_
+// The reason we write our own hash map instead of using unordered_map in STL,
+// is that STL containers use a mutex pool on debug build, which will lead to
+// deadlock when we are using async signal handler.
+
+#ifndef V8_BASE_HASHMAP_H_
+#define V8_BASE_HASHMAP_H_
-#include "src/allocation.h"
#include "src/base/bits.h"
#include "src/base/logging.h"
-#include "src/utils.h"
namespace v8 {
-namespace internal {
+namespace base {
+
+class DefaultAllocationPolicy {
+ public:
+ V8_INLINE void* New(size_t size) { return malloc(size); }
+ V8_INLINE static void Delete(void* p) { free(p); }
+};
-template<class AllocationPolicy>
+template <class AllocationPolicy>
class TemplateHashMapImpl {
public:
- typedef bool (*MatchFun) (void* key1, void* key2);
+ typedef bool (*MatchFun)(void* key1, void* key2);
// The default capacity. This is used by the call sites which want
// to pass in a non-default AllocationPolicy but want to use the
@@ -38,7 +46,7 @@ class TemplateHashMapImpl {
void* key;
void* value;
uint32_t hash; // The full hash value for key
- int order; // If you never remove entries this is the insertion order.
+ int order; // If you never remove entries this is the insertion order.
};
// If an entry with matching key is found, returns that entry.
@@ -79,9 +87,7 @@ class TemplateHashMapImpl {
Entry* Next(Entry* p) const;
// Some match functions defined for convenience.
- static bool PointersMatch(void* key1, void* key2) {
- return key1 == key2;
- }
+ static bool PointersMatch(void* key1, void* key2) { return key1 == key2; }
private:
MatchFun match_;
@@ -95,22 +101,20 @@ class TemplateHashMapImpl {
void Resize(AllocationPolicy allocator);
};
-typedef TemplateHashMapImpl<FreeStoreAllocationPolicy> HashMap;
+typedef TemplateHashMapImpl<DefaultAllocationPolicy> HashMap;
-template<class AllocationPolicy>
+template <class AllocationPolicy>
TemplateHashMapImpl<AllocationPolicy>::TemplateHashMapImpl(
MatchFun match, uint32_t initial_capacity, AllocationPolicy allocator) {
match_ = match;
Initialize(initial_capacity, allocator);
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
TemplateHashMapImpl<AllocationPolicy>::~TemplateHashMapImpl() {
AllocationPolicy::Delete(map_);
}
-
template <class AllocationPolicy>
typename TemplateHashMapImpl<AllocationPolicy>::Entry*
TemplateHashMapImpl<AllocationPolicy>::Lookup(void* key, uint32_t hash) const {
@@ -118,7 +122,6 @@ TemplateHashMapImpl<AllocationPolicy>::Lookup(void* key, uint32_t hash) const {
return p->key != NULL ? p : NULL;
}
-
template <class AllocationPolicy>
typename TemplateHashMapImpl<AllocationPolicy>::Entry*
TemplateHashMapImpl<AllocationPolicy>::LookupOrInsert(
@@ -145,8 +148,7 @@ TemplateHashMapImpl<AllocationPolicy>::LookupOrInsert(
return p;
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
void* TemplateHashMapImpl<AllocationPolicy>::Remove(void* key, uint32_t hash) {
// Lookup the entry for the key to remove.
Entry* p = Probe(key, hash);
@@ -194,8 +196,7 @@ void* TemplateHashMapImpl<AllocationPolicy>::Remove(void* key, uint32_t hash) {
// If the entry at position q has its initial position outside the range
// between p and q it can be moved forward to position p and will still be
// found. There is now a new candidate entry for clearing.
- if ((q > p && (r <= p || r > q)) ||
- (q < p && (r <= p && r > q))) {
+ if ((q > p && (r <= p || r > q)) || (q < p && (r <= p && r > q))) {
*p = *q;
p = q;
}
@@ -207,8 +208,7 @@ void* TemplateHashMapImpl<AllocationPolicy>::Remove(void* key, uint32_t hash) {
return value;
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
void TemplateHashMapImpl<AllocationPolicy>::Clear() {
// Mark all entries as empty.
const Entry* end = map_end();
@@ -218,17 +218,15 @@ void TemplateHashMapImpl<AllocationPolicy>::Clear() {
occupancy_ = 0;
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
typename TemplateHashMapImpl<AllocationPolicy>::Entry*
- TemplateHashMapImpl<AllocationPolicy>::Start() const {
+TemplateHashMapImpl<AllocationPolicy>::Start() const {
return Next(map_ - 1);
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
typename TemplateHashMapImpl<AllocationPolicy>::Entry*
- TemplateHashMapImpl<AllocationPolicy>::Next(Entry* p) const {
+TemplateHashMapImpl<AllocationPolicy>::Next(Entry* p) const {
const Entry* end = map_end();
DCHECK(map_ - 1 <= p && p < end);
for (p++; p < end; p++) {
@@ -239,7 +237,6 @@ typename TemplateHashMapImpl<AllocationPolicy>::Entry*
return NULL;
}
-
template <class AllocationPolicy>
typename TemplateHashMapImpl<AllocationPolicy>::Entry*
TemplateHashMapImpl<AllocationPolicy>::Probe(void* key, uint32_t hash) const {
@@ -261,22 +258,20 @@ TemplateHashMapImpl<AllocationPolicy>::Probe(void* key, uint32_t hash) const {
return p;
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
void TemplateHashMapImpl<AllocationPolicy>::Initialize(
uint32_t capacity, AllocationPolicy allocator) {
DCHECK(base::bits::IsPowerOfTwo32(capacity));
map_ = reinterpret_cast<Entry*>(allocator.New(capacity * sizeof(Entry)));
if (map_ == NULL) {
- v8::internal::FatalProcessOutOfMemory("HashMap::Initialize");
+ FATAL("Out of memory: HashMap::Initialize");
return;
}
capacity_ = capacity;
Clear();
}
-
-template<class AllocationPolicy>
+template <class AllocationPolicy>
void TemplateHashMapImpl<AllocationPolicy>::Resize(AllocationPolicy allocator) {
Entry* map = map_;
uint32_t n = occupancy_;
@@ -298,12 +293,11 @@ void TemplateHashMapImpl<AllocationPolicy>::Resize(AllocationPolicy allocator) {
AllocationPolicy::Delete(map);
}
-
// A hash map for pointer keys and values with an STL-like interface.
-template<class Key, class Value, class AllocationPolicy>
-class TemplateHashMap: private TemplateHashMapImpl<AllocationPolicy> {
+template <class Key, class Value, class AllocationPolicy>
+class TemplateHashMap : private TemplateHashMapImpl<AllocationPolicy> {
public:
- STATIC_ASSERT(sizeof(Key*) == sizeof(void*)); // NOLINT
+ STATIC_ASSERT(sizeof(Key*) == sizeof(void*)); // NOLINT
STATIC_ASSERT(sizeof(Value*) == sizeof(void*)); // NOLINT
struct value_type {
Key* first;
@@ -318,12 +312,12 @@ class TemplateHashMap: private TemplateHashMapImpl<AllocationPolicy> {
}
value_type* operator->() { return reinterpret_cast<value_type*>(entry_); }
- bool operator!=(const Iterator& other) { return entry_ != other.entry_; }
+ bool operator!=(const Iterator& other) { return entry_ != other.entry_; }
private:
Iterator(const TemplateHashMapImpl<AllocationPolicy>* map,
- typename TemplateHashMapImpl<AllocationPolicy>::Entry* entry) :
- map_(map), entry_(entry) { }
+ typename TemplateHashMapImpl<AllocationPolicy>::Entry* entry)
+ : map_(map), entry_(entry) {}
const TemplateHashMapImpl<AllocationPolicy>* map_;
typename TemplateHashMapImpl<AllocationPolicy>::Entry* entry_;
@@ -334,10 +328,10 @@ class TemplateHashMap: private TemplateHashMapImpl<AllocationPolicy> {
TemplateHashMap(
typename TemplateHashMapImpl<AllocationPolicy>::MatchFun match,
AllocationPolicy allocator = AllocationPolicy())
- : TemplateHashMapImpl<AllocationPolicy>(
+ : TemplateHashMapImpl<AllocationPolicy>(
match,
TemplateHashMapImpl<AllocationPolicy>::kDefaultHashMapCapacity,
- allocator) { }
+ allocator) {}
Iterator begin() const { return Iterator(this, this->Start()); }
Iterator end() const { return Iterator(this, NULL); }
@@ -350,7 +344,7 @@ class TemplateHashMap: private TemplateHashMapImpl<AllocationPolicy> {
}
};
-} // namespace internal
+} // namespace base
} // namespace v8
-#endif // V8_HASHMAP_H_
+#endif // V8_BASE_HASHMAP_H_
« no previous file with comments | « src/ast/scopes.h ('k') | src/bootstrapper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698