| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/heap/mark-compact.h" | 5 #include "src/heap/mark-compact.h" |
| 6 | 6 |
| 7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/base/sys-info.h" | 9 #include "src/base/sys-info.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 | 839 |
| 840 DCHECK(!FLAG_never_compact || !FLAG_always_compact); | 840 DCHECK(!FLAG_never_compact || !FLAG_always_compact); |
| 841 | 841 |
| 842 if (sweeping_in_progress()) { | 842 if (sweeping_in_progress()) { |
| 843 // Instead of waiting we could also abort the sweeper threads here. | 843 // Instead of waiting we could also abort the sweeper threads here. |
| 844 EnsureSweepingCompleted(); | 844 EnsureSweepingCompleted(); |
| 845 } | 845 } |
| 846 | 846 |
| 847 // If concurrent unmapping tasks are still running, we should wait for | 847 // If concurrent unmapping tasks are still running, we should wait for |
| 848 // them here. | 848 // them here. |
| 849 heap()->WaitUntilUnmappingOfFreeChunksCompleted(); | 849 heap()->memory_allocator()->unmapper()->WaitUntilCompleted(); |
| 850 | 850 |
| 851 // Clear marking bits if incremental marking is aborted. | 851 // Clear marking bits if incremental marking is aborted. |
| 852 if (was_marked_incrementally_ && heap_->ShouldAbortIncrementalMarking()) { | 852 if (was_marked_incrementally_ && heap_->ShouldAbortIncrementalMarking()) { |
| 853 heap()->incremental_marking()->Stop(); | 853 heap()->incremental_marking()->Stop(); |
| 854 ClearMarkbits(); | 854 ClearMarkbits(); |
| 855 AbortWeakCollections(); | 855 AbortWeakCollections(); |
| 856 AbortWeakCells(); | 856 AbortWeakCells(); |
| 857 AbortTransitionArrays(); | 857 AbortTransitionArrays(); |
| 858 AbortCompaction(); | 858 AbortCompaction(); |
| 859 was_marked_incrementally_ = false; | 859 was_marked_incrementally_ = false; |
| (...skipping 2672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3532 EvacuateNewSpaceEpilogue(); | 3532 EvacuateNewSpaceEpilogue(); |
| 3533 heap()->new_space()->set_age_mark(heap()->new_space()->top()); | 3533 heap()->new_space()->set_age_mark(heap()->new_space()->top()); |
| 3534 } | 3534 } |
| 3535 | 3535 |
| 3536 UpdatePointersAfterEvacuation(); | 3536 UpdatePointersAfterEvacuation(); |
| 3537 | 3537 |
| 3538 // Give pages that are queued to be freed back to the OS. Note that filtering | 3538 // Give pages that are queued to be freed back to the OS. Note that filtering |
| 3539 // slots only handles old space (for unboxed doubles), and thus map space can | 3539 // slots only handles old space (for unboxed doubles), and thus map space can |
| 3540 // still contain stale pointers. We only free the chunks after pointer updates | 3540 // still contain stale pointers. We only free the chunks after pointer updates |
| 3541 // to still have access to page headers. | 3541 // to still have access to page headers. |
| 3542 heap()->FreeQueuedChunks(); | 3542 heap()->memory_allocator()->unmapper()->FreeQueuedChunks(); |
| 3543 | 3543 |
| 3544 { | 3544 { |
| 3545 TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_EVACUATE_CLEAN_UP); | 3545 TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_EVACUATE_CLEAN_UP); |
| 3546 | 3546 |
| 3547 for (Page* p : evacuation_candidates_) { | 3547 for (Page* p : evacuation_candidates_) { |
| 3548 // Important: skip list should be cleared only after roots were updated | 3548 // Important: skip list should be cleared only after roots were updated |
| 3549 // because root iteration traverses the stack and might have to find | 3549 // because root iteration traverses the stack and might have to find |
| 3550 // code objects from non-updated pc pointing into evacuation candidate. | 3550 // code objects from non-updated pc pointing into evacuation candidate. |
| 3551 SkipList* list = p->skip_list(); | 3551 SkipList* list = p->skip_list(); |
| 3552 if (list != NULL) list->Clear(); | 3552 if (list != NULL) list->Clear(); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3720 void MarkCompactCollector::ReleaseEvacuationCandidates() { | 3720 void MarkCompactCollector::ReleaseEvacuationCandidates() { |
| 3721 for (Page* p : evacuation_candidates_) { | 3721 for (Page* p : evacuation_candidates_) { |
| 3722 if (!p->IsEvacuationCandidate()) continue; | 3722 if (!p->IsEvacuationCandidate()) continue; |
| 3723 PagedSpace* space = static_cast<PagedSpace*>(p->owner()); | 3723 PagedSpace* space = static_cast<PagedSpace*>(p->owner()); |
| 3724 p->ResetLiveBytes(); | 3724 p->ResetLiveBytes(); |
| 3725 CHECK(p->SweepingDone()); | 3725 CHECK(p->SweepingDone()); |
| 3726 space->ReleasePage(p); | 3726 space->ReleasePage(p); |
| 3727 } | 3727 } |
| 3728 evacuation_candidates_.Rewind(0); | 3728 evacuation_candidates_.Rewind(0); |
| 3729 compacting_ = false; | 3729 compacting_ = false; |
| 3730 heap()->FreeQueuedChunks(); | 3730 heap()->memory_allocator()->unmapper()->FreeQueuedChunks(); |
| 3731 } | 3731 } |
| 3732 | 3732 |
| 3733 int MarkCompactCollector::Sweeper::ParallelSweepSpace(AllocationSpace identity, | 3733 int MarkCompactCollector::Sweeper::ParallelSweepSpace(AllocationSpace identity, |
| 3734 int required_freed_bytes, | 3734 int required_freed_bytes, |
| 3735 int max_pages) { | 3735 int max_pages) { |
| 3736 int max_freed = 0; | 3736 int max_freed = 0; |
| 3737 int pages_freed = 0; | 3737 int pages_freed = 0; |
| 3738 Page* page = nullptr; | 3738 Page* page = nullptr; |
| 3739 while ((page = GetSweepingPageSafe(identity)) != nullptr) { | 3739 while ((page = GetSweepingPageSafe(identity)) != nullptr) { |
| 3740 int freed = ParallelSweepPage(page, heap_->paged_space(identity)); | 3740 int freed = ParallelSweepPage(page, heap_->paged_space(identity)); |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3946 MarkBit mark_bit = Marking::MarkBitFrom(host); | 3946 MarkBit mark_bit = Marking::MarkBitFrom(host); |
| 3947 if (Marking::IsBlack(mark_bit)) { | 3947 if (Marking::IsBlack(mark_bit)) { |
| 3948 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); | 3948 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); |
| 3949 RecordRelocSlot(host, &rinfo, target); | 3949 RecordRelocSlot(host, &rinfo, target); |
| 3950 } | 3950 } |
| 3951 } | 3951 } |
| 3952 } | 3952 } |
| 3953 | 3953 |
| 3954 } // namespace internal | 3954 } // namespace internal |
| 3955 } // namespace v8 | 3955 } // namespace v8 |
| OLD | NEW |