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 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
391 | 391 |
392 | 392 |
393 void MarkCompactCollector::ClearMarkbits() { | 393 void MarkCompactCollector::ClearMarkbits() { |
394 ClearMarkbitsInPagedSpace(heap_->code_space()); | 394 ClearMarkbitsInPagedSpace(heap_->code_space()); |
395 ClearMarkbitsInPagedSpace(heap_->map_space()); | 395 ClearMarkbitsInPagedSpace(heap_->map_space()); |
396 ClearMarkbitsInPagedSpace(heap_->old_space()); | 396 ClearMarkbitsInPagedSpace(heap_->old_space()); |
397 ClearMarkbitsInNewSpace(heap_->new_space()); | 397 ClearMarkbitsInNewSpace(heap_->new_space()); |
398 | 398 |
399 LargeObjectIterator it(heap_->lo_space()); | 399 LargeObjectIterator it(heap_->lo_space()); |
400 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 400 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
401 Marking::MarkWhite(ObjectMarking::MarkBitFrom(obj)); | 401 ObjectMarking::MarkWhite(obj); |
402 MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); | 402 MemoryChunk* chunk = MemoryChunk::FromAddress(obj->address()); |
403 chunk->ResetProgressBar(); | 403 chunk->ResetProgressBar(); |
404 chunk->ResetLiveBytes(); | 404 chunk->ResetLiveBytes(); |
405 } | 405 } |
406 } | 406 } |
407 | 407 |
408 class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task { | 408 class MarkCompactCollector::Sweeper::SweeperTask : public v8::Task { |
409 public: | 409 public: |
410 SweeperTask(Sweeper* sweeper, base::Semaphore* pending_sweeper_tasks, | 410 SweeperTask(Sweeper* sweeper, base::Semaphore* pending_sweeper_tasks, |
411 AllocationSpace space_to_start) | 411 AllocationSpace space_to_start) |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1498 // is reached, whichever comes first. | 1498 // is reached, whichever comes first. |
1499 template <class T> | 1499 template <class T> |
1500 void MarkCompactCollector::DiscoverGreyObjectsWithIterator(T* it) { | 1500 void MarkCompactCollector::DiscoverGreyObjectsWithIterator(T* it) { |
1501 // The caller should ensure that the marking stack is initially not full, | 1501 // The caller should ensure that the marking stack is initially not full, |
1502 // so that we don't waste effort pointlessly scanning for objects. | 1502 // so that we don't waste effort pointlessly scanning for objects. |
1503 DCHECK(!marking_deque()->IsFull()); | 1503 DCHECK(!marking_deque()->IsFull()); |
1504 | 1504 |
1505 Map* filler_map = heap()->one_pointer_filler_map(); | 1505 Map* filler_map = heap()->one_pointer_filler_map(); |
1506 for (HeapObject* object = it->Next(); object != NULL; object = it->Next()) { | 1506 for (HeapObject* object = it->Next(); object != NULL; object = it->Next()) { |
1507 MarkBit markbit = ObjectMarking::MarkBitFrom(object); | 1507 MarkBit markbit = ObjectMarking::MarkBitFrom(object); |
1508 if ((object->map() != filler_map) && Marking::IsGrey(markbit)) { | 1508 if ((object->map() != filler_map) && Marking::IsGrey(markbit)) { |
Hannes Payer (out of office)
2017/01/18 14:43:35
It is a bit weird now that we still use MarkBit fo
Michael Lippautz
2017/01/18 15:58:07
Done.
| |
1509 Marking::GreyToBlack(markbit); | 1509 ObjectMarking::GreyToBlack(object); |
1510 PushBlack(object); | 1510 PushBlack(object); |
1511 if (marking_deque()->IsFull()) return; | 1511 if (marking_deque()->IsFull()) return; |
1512 } | 1512 } |
1513 } | 1513 } |
1514 } | 1514 } |
1515 | 1515 |
1516 void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) { | 1516 void MarkCompactCollector::DiscoverGreyObjectsOnPage(MemoryChunk* p) { |
1517 DCHECK(!marking_deque()->IsFull()); | 1517 DCHECK(!marking_deque()->IsFull()); |
1518 LiveObjectIterator<kGreyObjects> it(p); | 1518 LiveObjectIterator<kGreyObjects> it(p); |
1519 HeapObject* object = NULL; | 1519 HeapObject* object = NULL; |
1520 while ((object = it.Next()) != NULL) { | 1520 while ((object = it.Next()) != NULL) { |
1521 MarkBit markbit = ObjectMarking::MarkBitFrom(object); | 1521 MarkBit markbit = ObjectMarking::MarkBitFrom(object); |
Hannes Payer (out of office)
2017/01/18 14:43:35
Same here.
Michael Lippautz
2017/01/18 15:58:07
Done.
| |
1522 DCHECK(Marking::IsGrey(markbit)); | 1522 DCHECK(Marking::IsGrey(markbit)); |
1523 Marking::GreyToBlack(markbit); | 1523 ObjectMarking::GreyToBlack(object); |
1524 PushBlack(object); | 1524 PushBlack(object); |
1525 if (marking_deque()->IsFull()) return; | 1525 if (marking_deque()->IsFull()) return; |
1526 } | 1526 } |
1527 } | 1527 } |
1528 | 1528 |
1529 class RecordMigratedSlotVisitor final : public ObjectVisitor { | 1529 class RecordMigratedSlotVisitor final : public ObjectVisitor { |
1530 public: | 1530 public: |
1531 explicit RecordMigratedSlotVisitor(MarkCompactCollector* collector) | 1531 explicit RecordMigratedSlotVisitor(MarkCompactCollector* collector) |
1532 : collector_(collector) {} | 1532 : collector_(collector) {} |
1533 | 1533 |
(...skipping 2550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4084 // The target is always in old space, we don't have to record the slot in | 4084 // The target is always in old space, we don't have to record the slot in |
4085 // the old-to-new remembered set. | 4085 // the old-to-new remembered set. |
4086 DCHECK(!heap()->InNewSpace(target)); | 4086 DCHECK(!heap()->InNewSpace(target)); |
4087 RecordRelocSlot(host, &rinfo, target); | 4087 RecordRelocSlot(host, &rinfo, target); |
4088 } | 4088 } |
4089 } | 4089 } |
4090 } | 4090 } |
4091 | 4091 |
4092 } // namespace internal | 4092 } // namespace internal |
4093 } // namespace v8 | 4093 } // namespace v8 |
OLD | NEW |