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

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

Issue 1823783003: [heap] RecordWrites iterates black object to ensure marking progress. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 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 unified diff | Download patch
« no previous file with comments | « src/heap/mark-compact.h ('k') | src/heap/mark-compact-inl.h » ('j') | 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 992 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 1003
1004 candidate = next_candidate; 1004 candidate = next_candidate;
1005 } 1005 }
1006 1006
1007 shared_function_info_candidates_head_ = NULL; 1007 shared_function_info_candidates_head_ = NULL;
1008 } 1008 }
1009 1009
1010 1010
1011 void CodeFlusher::EvictCandidate(SharedFunctionInfo* shared_info) { 1011 void CodeFlusher::EvictCandidate(SharedFunctionInfo* shared_info) {
1012 // Make sure previous flushing decisions are revisited. 1012 // Make sure previous flushing decisions are revisited.
1013 isolate_->heap()->incremental_marking()->RecordWrites(shared_info); 1013 isolate_->heap()->incremental_marking()->IterateBlackObject(shared_info);
1014 1014
1015 if (FLAG_trace_code_flushing) { 1015 if (FLAG_trace_code_flushing) {
1016 PrintF("[code-flushing abandons function-info: "); 1016 PrintF("[code-flushing abandons function-info: ");
1017 shared_info->ShortPrint(); 1017 shared_info->ShortPrint();
1018 PrintF("]\n"); 1018 PrintF("]\n");
1019 } 1019 }
1020 1020
1021 SharedFunctionInfo* candidate = shared_function_info_candidates_head_; 1021 SharedFunctionInfo* candidate = shared_function_info_candidates_head_;
1022 SharedFunctionInfo* next_candidate; 1022 SharedFunctionInfo* next_candidate;
1023 if (candidate == shared_info) { 1023 if (candidate == shared_info) {
(...skipping 15 matching lines...) Expand all
1039 } 1039 }
1040 } 1040 }
1041 } 1041 }
1042 1042
1043 1043
1044 void CodeFlusher::EvictCandidate(JSFunction* function) { 1044 void CodeFlusher::EvictCandidate(JSFunction* function) {
1045 DCHECK(!function->next_function_link()->IsUndefined()); 1045 DCHECK(!function->next_function_link()->IsUndefined());
1046 Object* undefined = isolate_->heap()->undefined_value(); 1046 Object* undefined = isolate_->heap()->undefined_value();
1047 1047
1048 // Make sure previous flushing decisions are revisited. 1048 // Make sure previous flushing decisions are revisited.
1049 isolate_->heap()->incremental_marking()->RecordWrites(function); 1049 isolate_->heap()->incremental_marking()->IterateBlackObject(function);
1050 isolate_->heap()->incremental_marking()->RecordWrites(function->shared()); 1050 isolate_->heap()->incremental_marking()->IterateBlackObject(
1051 function->shared());
1051 1052
1052 if (FLAG_trace_code_flushing) { 1053 if (FLAG_trace_code_flushing) {
1053 PrintF("[code-flushing abandons closure: "); 1054 PrintF("[code-flushing abandons closure: ");
1054 function->shared()->ShortPrint(); 1055 function->shared()->ShortPrint();
1055 PrintF("]\n"); 1056 PrintF("]\n");
1056 } 1057 }
1057 1058
1058 JSFunction* candidate = jsfunction_candidates_head_; 1059 JSFunction* candidate = jsfunction_candidates_head_;
1059 JSFunction* next_candidate; 1060 JSFunction* next_candidate;
1060 if (candidate == function) { 1061 if (candidate == function) {
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
1486 for (HeapObject* object = it->Next(); object != NULL; object = it->Next()) { 1487 for (HeapObject* object = it->Next(); object != NULL; object = it->Next()) {
1487 MarkBit markbit = Marking::MarkBitFrom(object); 1488 MarkBit markbit = Marking::MarkBitFrom(object);
1488 if ((object->map() != filler_map) && Marking::IsGrey(markbit)) { 1489 if ((object->map() != filler_map) && Marking::IsGrey(markbit)) {
1489 Marking::GreyToBlack(markbit); 1490 Marking::GreyToBlack(markbit);
1490 PushBlack(object); 1491 PushBlack(object);
1491 if (marking_deque()->IsFull()) return; 1492 if (marking_deque()->IsFull()) return;
1492 } 1493 }
1493 } 1494 }
1494 } 1495 }
1495 1496
1496 template <LiveObjectIterationMode T>
1497 void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) { 1497 void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) {
1498 DCHECK(!marking_deque()->IsFull()); 1498 DCHECK(!marking_deque()->IsFull());
1499 DCHECK(T == kGreyObjects || T == kGreyObjectsOnBlackPage); 1499 LiveObjectIterator<kGreyObjects> it(p);
1500 LiveObjectIterator<T> it(p);
1501 HeapObject* object = NULL; 1500 HeapObject* object = NULL;
1502 while ((object = it.Next()) != NULL) { 1501 while ((object = it.Next()) != NULL) {
1503 MarkBit markbit = Marking::MarkBitFrom(object); 1502 MarkBit markbit = Marking::MarkBitFrom(object);
1504 DCHECK(Marking::IsGrey(markbit)); 1503 DCHECK(Marking::IsGrey(markbit));
1505 Marking::GreyToBlack(markbit); 1504 Marking::GreyToBlack(markbit);
1506 PushBlack(object); 1505 PushBlack(object);
1507 if (marking_deque()->IsFull()) return; 1506 if (marking_deque()->IsFull()) return;
1508 } 1507 }
1509 } 1508 }
1510 1509
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
1770 } 1769 }
1771 return false; 1770 return false;
1772 } 1771 }
1773 }; 1772 };
1774 1773
1775 1774
1776 void MarkCompactCollector::DiscoverGreyObjectsInSpace(PagedSpace* space) { 1775 void MarkCompactCollector::DiscoverGreyObjectsInSpace(PagedSpace* space) {
1777 PageIterator it(space); 1776 PageIterator it(space);
1778 while (it.has_next()) { 1777 while (it.has_next()) {
1779 Page* p = it.next(); 1778 Page* p = it.next();
1780 if (p->IsFlagSet(Page::BLACK_PAGE)) { 1779 if (!p->IsFlagSet(Page::BLACK_PAGE)) {
1781 DiscoverGreyObjectsOnPage<kGreyObjectsOnBlackPage>(p); 1780 DiscoverGreyObjectsOnPage(p);
1782 } else {
1783 DiscoverGreyObjectsOnPage<kGreyObjects>(p);
1784 } 1781 }
1785 if (marking_deque()->IsFull()) return; 1782 if (marking_deque()->IsFull()) return;
1786 } 1783 }
1787 } 1784 }
1788 1785
1789 1786
1790 void MarkCompactCollector::DiscoverGreyObjectsInNewSpace() { 1787 void MarkCompactCollector::DiscoverGreyObjectsInNewSpace() {
1791 NewSpace* space = heap()->new_space(); 1788 NewSpace* space = heap()->new_space();
1792 NewSpacePageIterator it(space->bottom(), space->top()); 1789 NewSpacePageIterator it(space->bottom(), space->top());
1793 while (it.has_next()) { 1790 while (it.has_next()) {
1794 NewSpacePage* page = it.next(); 1791 NewSpacePage* page = it.next();
1795 DiscoverGreyObjectsOnPage<kGreyObjects>(page); 1792 DiscoverGreyObjectsOnPage(page);
1796 if (marking_deque()->IsFull()) return; 1793 if (marking_deque()->IsFull()) return;
1797 } 1794 }
1798 } 1795 }
1799 1796
1800 1797
1801 bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) { 1798 bool MarkCompactCollector::IsUnmarkedHeapObject(Object** p) {
1802 Object* o = *p; 1799 Object* o = *p;
1803 if (!o->IsHeapObject()) return false; 1800 if (!o->IsHeapObject()) return false;
1804 HeapObject* heap_object = HeapObject::cast(o); 1801 HeapObject* heap_object = HeapObject::cast(o);
1805 MarkBit mark = Marking::MarkBitFrom(heap_object); 1802 MarkBit mark = Marking::MarkBitFrom(heap_object);
(...skipping 1985 matching lines...) Expand 10 before | Expand all | Expand 10 after
3791 MarkBit mark_bit = Marking::MarkBitFrom(host); 3788 MarkBit mark_bit = Marking::MarkBitFrom(host);
3792 if (Marking::IsBlack(mark_bit)) { 3789 if (Marking::IsBlack(mark_bit)) {
3793 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host); 3790 RelocInfo rinfo(isolate(), pc, RelocInfo::CODE_TARGET, 0, host);
3794 RecordRelocSlot(host, &rinfo, target); 3791 RecordRelocSlot(host, &rinfo, target);
3795 } 3792 }
3796 } 3793 }
3797 } 3794 }
3798 3795
3799 } // namespace internal 3796 } // namespace internal
3800 } // namespace v8 3797 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap/mark-compact.h ('k') | src/heap/mark-compact-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698