Chromium Code Reviews| Index: src/heap/spaces.h |
| diff --git a/src/heap/spaces.h b/src/heap/spaces.h |
| index c035342bfa85058dd9be34024e17cbc6d5722be3..db860ff77f118a06848fe4e9068e70a59fc0339a 100644 |
| --- a/src/heap/spaces.h |
| +++ b/src/heap/spaces.h |
| @@ -7,6 +7,7 @@ |
| #include <list> |
| #include <memory> |
| +#include <unordered_set> |
| #include "src/allocation.h" |
| #include "src/base/atomic-utils.h" |
| @@ -350,7 +351,9 @@ class MemoryChunk { |
| + kPointerSize // AtomicValue prev_chunk_ |
| // FreeListCategory categories_[kNumberOfCategories] |
| + FreeListCategory::kSize * kNumberOfCategories + |
| - kPointerSize; // LocalArrayBufferTracker* local_tracker_; |
| + kPointerSize // LocalArrayBufferTracker* local_tracker_; |
| + // std::unordered_set<Address>* black_area_end_marker_map_ |
| + + kPointerSize; |
| // We add some more space to the computed header size to amount for missing |
| // alignment requirements in our computation. |
| @@ -592,6 +595,30 @@ class MemoryChunk { |
| void InsertAfter(MemoryChunk* other); |
| void Unlink(); |
| + void ReleaseBlackAreaEndMarkerMap() { |
| + if (black_area_end_marker_map_) { |
| + delete black_area_end_marker_map_; |
| + black_area_end_marker_map_ = nullptr; |
| + } |
| + } |
| + |
| + bool IsBlackAreaEndMarker(Address address) { |
| + if (black_area_end_marker_map_) { |
| + return black_area_end_marker_map_->find(address) != |
| + black_area_end_marker_map_->end(); |
| + } |
| + return false; |
| + } |
| + |
| + void AddBlackAreaEndMarker(Address address) { |
| + if (!black_area_end_marker_map_) { |
| + black_area_end_marker_map_ = new std::unordered_set<Address>(); |
| + } |
| + black_area_end_marker_map_->insert(address); |
|
Michael Lippautz
2016/08/11 10:58:48
nit: Check that you don't insert duplicates.
e.g.
|
| + } |
| + |
| + bool HasBlackAreas() { return black_area_end_marker_map_ != nullptr; } |
| + |
| protected: |
| static MemoryChunk* Initialize(Heap* heap, Address base, size_t size, |
| Address area_start, Address area_end, |
| @@ -660,6 +687,9 @@ class MemoryChunk { |
| LocalArrayBufferTracker* local_tracker_; |
| + // Stores the end addresses of black areas. |
| + std::unordered_set<Address>* black_area_end_marker_map_; |
| + |
| private: |
| void InitializeReservedMemory() { reservation_.Reset(); } |
| @@ -1481,14 +1511,22 @@ class HeapObjectIterator : public ObjectIterator { |
| // space. |
| class AllocationInfo { |
| public: |
| - AllocationInfo() : top_(nullptr), limit_(nullptr) {} |
| - AllocationInfo(Address top, Address limit) : top_(top), limit_(limit) {} |
| + AllocationInfo() : original_top_(nullptr), top_(nullptr), limit_(nullptr) {} |
| + AllocationInfo(Address top, Address limit) |
| + : original_top_(top), top_(top), limit_(limit) {} |
| void Reset(Address top, Address limit) { |
| + original_top_ = top; |
| set_top(top); |
| set_limit(limit); |
| } |
| + Address original_top() { |
| + SLOW_DCHECK(top_ == NULL || |
| + (reinterpret_cast<intptr_t>(top_) & kHeapObjectTagMask) == 0); |
| + return original_top_; |
| + } |
| + |
| INLINE(void set_top(Address top)) { |
| SLOW_DCHECK(top == NULL || |
| (reinterpret_cast<intptr_t>(top) & kHeapObjectTagMask) == 0); |
| @@ -1522,6 +1560,8 @@ class AllocationInfo { |
| #endif |
| private: |
| + // The original top address when the allocation info was initialized. |
| + Address original_top_; |
| // Current allocation top. |
| Address top_; |
| // Current allocation limit. |