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

Side by Side Diff: src/heap/mark-compact.cc

Issue 2870683003: [heap] Factor out marking state of array buffer tracker (Closed)
Patch Set: Get MarkingState out of thin air Created 3 years, 7 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 unified diff | Download patch
« no previous file with comments | « src/heap/array-buffer-tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3766 matching lines...) Expand 10 before | Expand all | Expand 10 after
3777 3777
3778 int MarkCompactCollector::Sweeper::RawSweep( 3778 int MarkCompactCollector::Sweeper::RawSweep(
3779 Page* p, FreeListRebuildingMode free_list_mode, 3779 Page* p, FreeListRebuildingMode free_list_mode,
3780 FreeSpaceTreatmentMode free_space_mode) { 3780 FreeSpaceTreatmentMode free_space_mode) {
3781 Space* space = p->owner(); 3781 Space* space = p->owner();
3782 DCHECK_NOT_NULL(space); 3782 DCHECK_NOT_NULL(space);
3783 DCHECK(free_list_mode == IGNORE_FREE_LIST || space->identity() == OLD_SPACE || 3783 DCHECK(free_list_mode == IGNORE_FREE_LIST || space->identity() == OLD_SPACE ||
3784 space->identity() == CODE_SPACE || space->identity() == MAP_SPACE); 3784 space->identity() == CODE_SPACE || space->identity() == MAP_SPACE);
3785 DCHECK(!p->IsEvacuationCandidate() && !p->SweepingDone()); 3785 DCHECK(!p->IsEvacuationCandidate() && !p->SweepingDone());
3786 3786
3787 // Sweeper takes the marking state of the full collector.
3788 const MarkingState state = MarkingState::Internal(p);
3789
3787 // If there are old-to-new slots in that page, we have to filter out slots 3790 // If there are old-to-new slots in that page, we have to filter out slots
3788 // that are in dead memory which is freed by the sweeper. 3791 // that are in dead memory which is freed by the sweeper.
3789 ClearOldToNewSlotsMode slots_clearing_mode = GetClearOldToNewSlotsMode(p); 3792 ClearOldToNewSlotsMode slots_clearing_mode = GetClearOldToNewSlotsMode(p);
3790 3793
3791 // The free ranges map is used for filtering typed slots. 3794 // The free ranges map is used for filtering typed slots.
3792 std::map<uint32_t, uint32_t> free_ranges; 3795 std::map<uint32_t, uint32_t> free_ranges;
3793 3796
3794 // Before we sweep objects on the page, we free dead array buffers which 3797 // Before we sweep objects on the page, we free dead array buffers which
3795 // requires valid mark bits. 3798 // requires valid mark bits.
3796 ArrayBufferTracker::FreeDead(p); 3799 ArrayBufferTracker::FreeDead(p, state);
3797 3800
3798 Address free_start = p->area_start(); 3801 Address free_start = p->area_start();
3799 DCHECK(reinterpret_cast<intptr_t>(free_start) % (32 * kPointerSize) == 0); 3802 DCHECK(reinterpret_cast<intptr_t>(free_start) % (32 * kPointerSize) == 0);
3800 3803
3801 // If we use the skip list for code space pages, we have to lock the skip 3804 // If we use the skip list for code space pages, we have to lock the skip
3802 // list because it could be accessed concurrently by the runtime or the 3805 // list because it could be accessed concurrently by the runtime or the
3803 // deoptimizer. 3806 // deoptimizer.
3804 const bool rebuild_skip_list = 3807 const bool rebuild_skip_list =
3805 space->identity() == CODE_SPACE && p->skip_list() != nullptr; 3808 space->identity() == CODE_SPACE && p->skip_list() != nullptr;
3806 SkipList* skip_list = p->skip_list(); 3809 SkipList* skip_list = p->skip_list();
3807 if (rebuild_skip_list) { 3810 if (rebuild_skip_list) {
3808 skip_list->Clear(); 3811 skip_list->Clear();
3809 } 3812 }
3810 3813
3811 intptr_t freed_bytes = 0; 3814 intptr_t freed_bytes = 0;
3812 intptr_t max_freed_bytes = 0; 3815 intptr_t max_freed_bytes = 0;
3813 int curr_region = -1; 3816 int curr_region = -1;
3814 3817
3815 LiveObjectIterator<kBlackObjects> it(p, MarkingState::Internal(p)); 3818 LiveObjectIterator<kBlackObjects> it(p, state);
3816 HeapObject* object = NULL; 3819 HeapObject* object = NULL;
3817 3820
3818 while ((object = it.Next()) != NULL) { 3821 while ((object = it.Next()) != NULL) {
3819 DCHECK(ObjectMarking::IsBlack(object, MarkingState::Internal(object))); 3822 DCHECK(ObjectMarking::IsBlack(object, state));
3820 Address free_end = object->address(); 3823 Address free_end = object->address();
3821 if (free_end != free_start) { 3824 if (free_end != free_start) {
3822 CHECK_GT(free_end, free_start); 3825 CHECK_GT(free_end, free_start);
3823 size_t size = static_cast<size_t>(free_end - free_start); 3826 size_t size = static_cast<size_t>(free_end - free_start);
3824 if (free_space_mode == ZAP_FREE_SPACE) { 3827 if (free_space_mode == ZAP_FREE_SPACE) {
3825 memset(free_start, 0xcc, size); 3828 memset(free_start, 0xcc, size);
3826 } 3829 }
3827 if (free_list_mode == REBUILD_FREE_LIST) { 3830 if (free_list_mode == REBUILD_FREE_LIST) {
3828 freed_bytes = reinterpret_cast<PagedSpace*>(space)->UnaccountedFree( 3831 freed_bytes = reinterpret_cast<PagedSpace*>(space)->UnaccountedFree(
3829 free_start, size); 3832 free_start, size);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3883 3886
3884 // Clear invalid typed slots after collection all free ranges. 3887 // Clear invalid typed slots after collection all free ranges.
3885 if (slots_clearing_mode == CLEAR_TYPED_SLOTS) { 3888 if (slots_clearing_mode == CLEAR_TYPED_SLOTS) {
3886 TypedSlotSet* typed_slot_set = p->typed_slot_set<OLD_TO_NEW>(); 3889 TypedSlotSet* typed_slot_set = p->typed_slot_set<OLD_TO_NEW>();
3887 if (typed_slot_set != nullptr) { 3890 if (typed_slot_set != nullptr) {
3888 typed_slot_set->RemoveInvaldSlots(free_ranges); 3891 typed_slot_set->RemoveInvaldSlots(free_ranges);
3889 } 3892 }
3890 } 3893 }
3891 3894
3892 // Clear the mark bits of that page and reset live bytes count. 3895 // Clear the mark bits of that page and reset live bytes count.
3893 MarkingState::Internal(p).ClearLiveness(); 3896 state.ClearLiveness();
3894 3897
3895 p->concurrent_sweeping_state().SetValue(Page::kSweepingDone); 3898 p->concurrent_sweeping_state().SetValue(Page::kSweepingDone);
3896 if (free_list_mode == IGNORE_FREE_LIST) return 0; 3899 if (free_list_mode == IGNORE_FREE_LIST) return 0;
3897 return static_cast<int>(FreeList::GuaranteedAllocatable(max_freed_bytes)); 3900 return static_cast<int>(FreeList::GuaranteedAllocatable(max_freed_bytes));
3898 } 3901 }
3899 3902
3900 void MarkCompactCollector::InvalidateCode(Code* code) { 3903 void MarkCompactCollector::InvalidateCode(Code* code) {
3901 Page* page = Page::FromAddress(code->address()); 3904 Page* page = Page::FromAddress(code->address());
3902 Address start = code->instruction_start(); 3905 Address start = code->instruction_start();
3903 Address end = code->address() + code->Size(); 3906 Address end = code->address() + code->Size();
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after
4527 // The target is always in old space, we don't have to record the slot in 4530 // The target is always in old space, we don't have to record the slot in
4528 // the old-to-new remembered set. 4531 // the old-to-new remembered set.
4529 DCHECK(!heap()->InNewSpace(target)); 4532 DCHECK(!heap()->InNewSpace(target));
4530 RecordRelocSlot(host, &rinfo, target); 4533 RecordRelocSlot(host, &rinfo, target);
4531 } 4534 }
4532 } 4535 }
4533 } 4536 }
4534 4537
4535 } // namespace internal 4538 } // namespace internal
4536 } // namespace v8 4539 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/array-buffer-tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698