| Index: src/spaces.h
|
| diff --git a/src/spaces.h b/src/spaces.h
|
| index 9121e9cea3c9da0c9735eae003b168e05550a699..4fbabd6349d43364e9fe387c3ad0352e6ed42462 100644
|
| --- a/src/spaces.h
|
| +++ b/src/spaces.h
|
| @@ -397,6 +397,12 @@ class MemoryChunk {
|
| WAS_SWEPT_PRECISELY,
|
| WAS_SWEPT_CONSERVATIVELY,
|
|
|
| + // Large objects can have a progress bar in their page header. These object
|
| + // are scanned in increments and will be kept black while being scanned.
|
| + // Even if the mutator writes to them they will be kept black and a white
|
| + // to grey transition is performed in the value.
|
| + HAS_PROGRESS_BAR,
|
| +
|
| // Last flag, keep at bottom.
|
| NUM_MEMORY_CHUNK_FLAGS
|
| };
|
| @@ -480,6 +486,23 @@ class MemoryChunk {
|
| write_barrier_counter_ = counter;
|
| }
|
|
|
| + int progress_bar() {
|
| + ASSERT(IsFlagSet(HAS_PROGRESS_BAR));
|
| + return progress_bar_;
|
| + }
|
| +
|
| + void set_progress_bar(int progress_bar) {
|
| + ASSERT(IsFlagSet(HAS_PROGRESS_BAR));
|
| + progress_bar_ = progress_bar;
|
| + }
|
| +
|
| + void ResetProgressBar() {
|
| + if (IsFlagSet(MemoryChunk::HAS_PROGRESS_BAR)) {
|
| + set_progress_bar(0);
|
| + ClearFlag(MemoryChunk::HAS_PROGRESS_BAR);
|
| + }
|
| + }
|
| +
|
|
|
| static void IncrementLiveBytesFromGC(Address address, int by) {
|
| MemoryChunk::FromAddress(address)->IncrementLiveBytes(by);
|
| @@ -505,7 +528,7 @@ class MemoryChunk {
|
| kSlotsBufferOffset + kPointerSize + kPointerSize;
|
|
|
| static const size_t kHeaderSize =
|
| - kWriteBarrierCounterOffset + kPointerSize + kPointerSize;
|
| + kWriteBarrierCounterOffset + kPointerSize + kIntSize + kIntSize;
|
|
|
| static const int kBodyOffset =
|
| CODE_POINTER_ALIGN(kHeaderSize + Bitmap::kSize);
|
| @@ -649,6 +672,9 @@ class MemoryChunk {
|
| SlotsBuffer* slots_buffer_;
|
| SkipList* skip_list_;
|
| intptr_t write_barrier_counter_;
|
| + // Used by the incremental marker to keep track of the scanning progress in
|
| + // large objects that have a progress bar and are scanned in increments.
|
| + int progress_bar_;
|
| // Assuming the initial allocation on a page is sequential,
|
| // count highest number of bytes ever allocated on the page.
|
| int high_water_mark_;
|
|
|