| Index: src/incremental-marking.cc
|
| ===================================================================
|
| --- src/incremental-marking.cc (revision 7781)
|
| +++ src/incremental-marking.cc (working copy)
|
| @@ -212,14 +212,14 @@
|
| }
|
| }
|
|
|
| -static VirtualMemory* marking_stack_memory = NULL;
|
| +static VirtualMemory* marking_deque_memory = NULL;
|
|
|
| -static void EnsureMarkingStackIsCommitted() {
|
| - if (marking_stack_memory == NULL) {
|
| - marking_stack_memory = new VirtualMemory(4*MB);
|
| - marking_stack_memory->Commit(
|
| - reinterpret_cast<Address>(marking_stack_memory->address()),
|
| - marking_stack_memory->size(),
|
| +static void EnsureMarkingDequeIsCommitted() {
|
| + if (marking_deque_memory == NULL) {
|
| + marking_deque_memory = new VirtualMemory(4*MB);
|
| + marking_deque_memory->Commit(
|
| + reinterpret_cast<Address>(marking_deque_memory->address()),
|
| + marking_deque_memory->size(),
|
| false); // Not executable.
|
| }
|
| }
|
| @@ -237,12 +237,12 @@
|
|
|
| PatchIncrementalMarkingRecordWriteStubs(true);
|
|
|
| - EnsureMarkingStackIsCommitted();
|
| + EnsureMarkingDequeIsCommitted();
|
|
|
| // Initialize marking stack.
|
| - Address addr = static_cast<Address>(marking_stack_memory->address());
|
| - marking_stack_.Initialize(addr,
|
| - addr + marking_stack_memory->size());
|
| + Address addr = static_cast<Address>(marking_deque_memory->address());
|
| + marking_deque_.Initialize(addr,
|
| + addr + marking_deque_memory->size());
|
|
|
| // Clear markbits.
|
| Address new_space_low = heap_->new_space()->ToSpaceLow();
|
| @@ -279,29 +279,34 @@
|
| }
|
|
|
|
|
| -void IncrementalMarking::UpdateMarkingStackAfterScavenge() {
|
| +void IncrementalMarking::UpdateMarkingDequeAfterScavenge() {
|
| if (IsStopped()) return;
|
|
|
| - HeapObject** current = marking_stack_.low();
|
| - HeapObject** top = marking_stack_.top();
|
| - HeapObject** new_top = current;
|
| + intptr_t current = marking_deque_.bottom();
|
| + intptr_t mask = marking_deque_.mask();
|
| + intptr_t limit = marking_deque_.top();
|
| + HeapObject** array = marking_deque_.array();
|
| + intptr_t new_top = current;
|
|
|
| - while (current < top) {
|
| - HeapObject* obj = *current++;
|
| + while (current != limit) {
|
| + HeapObject* obj = array[current];
|
| + current = ((current + 1) & mask);
|
| if (heap_->InNewSpace(obj)) {
|
| MapWord map_word = obj->map_word();
|
| if (map_word.IsForwardingAddress()) {
|
| HeapObject* dest = map_word.ToForwardingAddress();
|
| WhiteToGrey(dest, heap_->marking()->MarkBitFrom(dest));
|
| - *new_top++ = dest;
|
| + array[new_top] = dest;
|
| + new_top = ((new_top + 1) & mask);
|
| ASSERT(Color(obj) == Color(dest));
|
| }
|
| } else {
|
| - *new_top++ = obj;
|
| + array[new_top] = obj;
|
| + new_top = ((new_top + 1) & mask);
|
| }
|
| }
|
|
|
| - marking_stack_.set_top(new_top);
|
| + marking_deque_.set_top(new_top);
|
| }
|
|
|
|
|
| @@ -316,8 +321,8 @@
|
| // was stopped.
|
| Map* filler_map = heap_->one_pointer_filler_map();
|
| IncrementalMarkingMarkingVisitor marking_visitor(heap_, this);
|
| - while (!marking_stack_.is_empty()) {
|
| - HeapObject* obj = marking_stack_.Pop();
|
| + while (!marking_deque_.IsEmpty()) {
|
| + HeapObject* obj = marking_deque_.Pop();
|
|
|
| // Explicitly skip one word fillers. Incremental markbit patterns are
|
| // correct only for objects that occupy at least two words.
|
| @@ -344,7 +349,7 @@
|
| IncrementalMarking::set_should_hurry(false);
|
| ResetStepCounters();
|
| PatchIncrementalMarkingRecordWriteStubs(false);
|
| - ASSERT(marking_stack_.is_empty());
|
| + ASSERT(marking_deque_.IsEmpty());
|
| ISOLATE->stack_guard()->Continue(GC_REQUEST);
|
| }
|
|
|
| @@ -384,8 +389,8 @@
|
| Map* filler_map = heap_->one_pointer_filler_map();
|
| IncrementalMarkingMarkingVisitor marking_visitor(heap_, this);
|
| Marking* marking = heap_->marking();
|
| - while (!marking_stack_.is_empty() && bytes_to_process > 0) {
|
| - HeapObject* obj = marking_stack_.Pop();
|
| + while (!marking_deque_.IsEmpty() && bytes_to_process > 0) {
|
| + HeapObject* obj = marking_deque_.Pop();
|
|
|
| // Explicitly skip one word fillers. Incremental markbit patterns are
|
| // correct only for objects that occupy at least two words.
|
| @@ -404,7 +409,7 @@
|
| count++;
|
| }
|
| allocated_ = 0;
|
| - if (marking_stack_.is_empty()) MarkingComplete();
|
| + if (marking_deque_.IsEmpty()) MarkingComplete();
|
| if (FLAG_trace_incremental_marking || FLAG_trace_gc) {
|
| double end = OS::TimeCurrentMillis();
|
| steps_took_ += (end - start);
|
|
|