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

Unified Diff: src/heap/spaces.h

Issue 2770253002: [heap] Enforce explicit MarkingState (Closed)
Patch Set: rebase Created 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/scavenger.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/spaces.h
diff --git a/src/heap/spaces.h b/src/heap/spaces.h
index 0a526e16be255427f5e71d6724b01fb9e65a8ba0..5bfd08a81f175073334e8646edd37d5baac26302 100644
--- a/src/heap/spaces.h
+++ b/src/heap/spaces.h
@@ -224,10 +224,6 @@ class FreeListCategory {
friend class PagedSpace;
};
-// MarkingMode determines which bitmaps and counters should be used when
-// accessing marking information on MemoryChunk.
-enum class MarkingMode { FULL, YOUNG_GENERATION };
-
// MemoryChunk represents a memory region owned by a specific space.
// It is divided into the header and the body. Chunk start is always
// 1MB aligned. Start of the body is aligned so it can accommodate
@@ -377,9 +373,6 @@ class MemoryChunk {
static const int kAllocatableMemory = kPageSize - kObjectStartOffset;
- template <MarkingMode mode = MarkingMode::FULL>
- static inline void IncrementLiveBytes(HeapObject* object, int by);
-
// Only works if the pointer is in the first kPageSize of the MemoryChunk.
static MemoryChunk* FromAddress(Address a) {
return reinterpret_cast<MemoryChunk*>(OffsetFrom(a) & ~kAlignmentMask);
@@ -427,33 +420,6 @@ class MemoryChunk {
return concurrent_sweeping_state().Value() == kSweepingDone;
}
- // Manage live byte count, i.e., count of bytes in black objects.
- template <MarkingMode mode = MarkingMode::FULL>
- inline void ResetLiveBytes();
- template <MarkingMode mode = MarkingMode::FULL>
- inline void IncrementLiveBytes(int by);
-
- template <MarkingMode mode = MarkingMode::FULL>
- int LiveBytes() {
- switch (mode) {
- case MarkingMode::FULL:
- DCHECK_LE(static_cast<unsigned>(live_byte_count_), size_);
- return static_cast<int>(live_byte_count_);
- case MarkingMode::YOUNG_GENERATION:
- DCHECK_LE(static_cast<unsigned>(young_generation_live_byte_count_),
- size_);
- return static_cast<int>(young_generation_live_byte_count_);
- }
- UNREACHABLE();
- return 0;
- }
-
- void SetLiveBytes(int live_bytes) {
- DCHECK_GE(live_bytes, 0);
- DCHECK_LE(static_cast<size_t>(live_bytes), size_);
- live_byte_count_ = live_bytes;
- }
-
size_t size() const { return size_; }
void set_size(size_t size) { size_ = size; }
@@ -513,19 +479,6 @@ class MemoryChunk {
}
}
- template <MarkingMode mode = MarkingMode::FULL>
- inline Bitmap* markbits() const {
- return mode == MarkingMode::FULL
- ? Bitmap::FromAddress(address() + kHeaderSize)
- : young_generation_bitmap_;
- }
-
- template <MarkingMode mode = MarkingMode::FULL>
- inline intptr_t* live_bytes_address() {
- return mode == MarkingMode::FULL ? &live_byte_count_
- : &young_generation_live_byte_count_;
- }
-
inline uint32_t AddressToMarkbitIndex(Address addr) const {
return static_cast<uint32_t>(addr - this->address()) >> kPointerSizeLog2;
}
@@ -534,11 +487,6 @@ class MemoryChunk {
return this->address() + (index << kPointerSizeLog2);
}
- template <MarkingMode mode = MarkingMode::FULL>
- void ClearLiveness();
-
- void PrintMarkbits() { markbits()->Print(); }
-
void SetFlag(Flag flag) { flags_ |= flag; }
void ClearFlag(Flag flag) { flags_ &= ~Flags(flag); }
bool IsFlagSet(Flag flag) { return (flags_ & flag) != 0; }
@@ -622,9 +570,6 @@ class MemoryChunk {
base::VirtualMemory* reserved_memory() { return &reservation_; }
- template <MarkingMode mode = MarkingMode::FULL>
- inline void TraceLiveBytes(intptr_t old_value, intptr_t new_value);
-
size_t size_;
Flags flags_;
@@ -686,6 +631,7 @@ class MemoryChunk {
private:
void InitializeReservedMemory() { reservation_.Reset(); }
+ friend class MarkingState;
friend class MemoryAllocator;
friend class MemoryChunkValidator;
};
@@ -695,6 +641,50 @@ DEFINE_OPERATORS_FOR_FLAGS(MemoryChunk::Flags)
static_assert(kMaxRegularHeapObjectSize <= MemoryChunk::kAllocatableMemory,
"kMaxRegularHeapObjectSize <= MemoryChunk::kAllocatableMemory");
+class MarkingState {
+ public:
+ static MarkingState External(HeapObject* object) {
+ return External(MemoryChunk::FromAddress(object->address()));
+ }
+
+ static MarkingState External(MemoryChunk* chunk) {
+ return MarkingState(chunk->young_generation_bitmap_,
+ &chunk->young_generation_live_byte_count_);
+ }
+
+ static MarkingState Internal(HeapObject* object) {
+ return Internal(MemoryChunk::FromAddress(object->address()));
+ }
+
+ static MarkingState Internal(MemoryChunk* chunk) {
+ return MarkingState(
+ Bitmap::FromAddress(chunk->address() + MemoryChunk::kHeaderSize),
+ &chunk->live_byte_count_);
+ }
+
+ MarkingState(Bitmap* bitmap, intptr_t* live_bytes)
+ : bitmap_(bitmap), live_bytes_(live_bytes) {}
+
+ void IncrementLiveBytes(intptr_t by) const {
+ *live_bytes_ += static_cast<int>(by);
+ }
+ void SetLiveBytes(intptr_t value) const {
+ *live_bytes_ = static_cast<int>(value);
+ }
+
+ void ClearLiveness() const {
+ bitmap_->Clear();
+ *live_bytes_ = 0;
+ }
+
+ Bitmap* bitmap() const { return bitmap_; }
+ intptr_t live_bytes() const { return *live_bytes_; }
+
+ private:
+ Bitmap* bitmap_;
+ intptr_t* live_bytes_;
+};
+
// -----------------------------------------------------------------------------
// A page is a memory chunk of a size 1MB. Large object pages may be larger.
//
« no previous file with comments | « src/heap/scavenger.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698