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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/compilation-cache.h" | 9 #include "src/compilation-cache.h" |
10 #include "src/cpu-profiler.h" | 10 #include "src/cpu-profiler.h" |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 current += object->Size(); | 201 current += object->Size(); |
202 } | 202 } |
203 } | 203 } |
204 } | 204 } |
205 | 205 |
206 | 206 |
207 static void VerifyEvacuation(PagedSpace* space) { | 207 static void VerifyEvacuation(PagedSpace* space) { |
208 // TODO(hpayer): Bring back VerifyEvacuation for parallel-concurrently | 208 // TODO(hpayer): Bring back VerifyEvacuation for parallel-concurrently |
209 // swept pages. | 209 // swept pages. |
210 if ((FLAG_concurrent_sweeping || FLAG_parallel_sweeping) && | 210 if ((FLAG_concurrent_sweeping || FLAG_parallel_sweeping) && |
211 space->was_swept_conservatively()) return; | 211 !space->is_iterable()) return; |
212 PageIterator it(space); | 212 PageIterator it(space); |
213 | 213 |
214 while (it.has_next()) { | 214 while (it.has_next()) { |
215 Page* p = it.next(); | 215 Page* p = it.next(); |
216 if (p->IsEvacuationCandidate()) continue; | 216 if (p->IsEvacuationCandidate()) continue; |
217 VerifyEvacuation(p->area_start(), p->area_end()); | 217 VerifyEvacuation(p->area_start(), p->area_end()); |
218 } | 218 } |
219 } | 219 } |
220 | 220 |
221 | 221 |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 space->AddToAccountingStats(freed_bytes); | 640 space->AddToAccountingStats(freed_bytes); |
641 space->DecrementUnsweptFreeBytes(freed_bytes); | 641 space->DecrementUnsweptFreeBytes(freed_bytes); |
642 } | 642 } |
643 | 643 |
644 | 644 |
645 bool MarkCompactCollector::AreSweeperThreadsActivated() { | 645 bool MarkCompactCollector::AreSweeperThreadsActivated() { |
646 return isolate()->sweeper_threads() != NULL || FLAG_job_based_sweeping; | 646 return isolate()->sweeper_threads() != NULL || FLAG_job_based_sweeping; |
647 } | 647 } |
648 | 648 |
649 | 649 |
650 bool MarkCompactCollector::IsConcurrentSweepingInProgress() { | 650 bool MarkCompactCollector::IsConcurrentSweepingInProgress(PagedSpace* space) { |
651 return sweeping_pending_; | 651 return (space == NULL || space->is_swept_concurrently()) && |
| 652 sweeping_pending_; |
652 } | 653 } |
653 | 654 |
654 | 655 |
655 void Marking::TransferMark(Address old_start, Address new_start) { | 656 void Marking::TransferMark(Address old_start, Address new_start) { |
656 // This is only used when resizing an object. | 657 // This is only used when resizing an object. |
657 ASSERT(MemoryChunk::FromAddress(old_start) == | 658 ASSERT(MemoryChunk::FromAddress(old_start) == |
658 MemoryChunk::FromAddress(new_start)); | 659 MemoryChunk::FromAddress(new_start)); |
659 | 660 |
660 if (!heap_->incremental_marking()->IsMarking()) return; | 661 if (!heap_->incremental_marking()->IsMarking()) return; |
661 | 662 |
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2037 } | 2038 } |
2038 *cells = 0; | 2039 *cells = 0; |
2039 } | 2040 } |
2040 return survivors_size; | 2041 return survivors_size; |
2041 } | 2042 } |
2042 | 2043 |
2043 | 2044 |
2044 static void DiscoverGreyObjectsInSpace(Heap* heap, | 2045 static void DiscoverGreyObjectsInSpace(Heap* heap, |
2045 MarkingDeque* marking_deque, | 2046 MarkingDeque* marking_deque, |
2046 PagedSpace* space) { | 2047 PagedSpace* space) { |
2047 if (!space->was_swept_conservatively()) { | 2048 if (space->is_iterable()) { |
2048 HeapObjectIterator it(space); | 2049 HeapObjectIterator it(space); |
2049 DiscoverGreyObjectsWithIterator(heap, marking_deque, &it); | 2050 DiscoverGreyObjectsWithIterator(heap, marking_deque, &it); |
2050 } else { | 2051 } else { |
2051 PageIterator it(space); | 2052 PageIterator it(space); |
2052 while (it.has_next()) { | 2053 while (it.has_next()) { |
2053 Page* p = it.next(); | 2054 Page* p = it.next(); |
2054 DiscoverGreyObjectsOnPage(marking_deque, p); | 2055 DiscoverGreyObjectsOnPage(marking_deque, p); |
2055 if (marking_deque->IsFull()) return; | 2056 if (marking_deque->IsFull()) return; |
2056 } | 2057 } |
2057 } | 2058 } |
(...skipping 2013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4071 SweepConservatively<SWEEP_IN_PARALLEL>(space, &private_free_list, p); | 4072 SweepConservatively<SWEEP_IN_PARALLEL>(space, &private_free_list, p); |
4072 free_list->Concatenate(&private_free_list); | 4073 free_list->Concatenate(&private_free_list); |
4073 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_FINALIZE); | 4074 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_FINALIZE); |
4074 } | 4075 } |
4075 if (p == space->end_of_unswept_pages()) break; | 4076 if (p == space->end_of_unswept_pages()) break; |
4076 } | 4077 } |
4077 } | 4078 } |
4078 | 4079 |
4079 | 4080 |
4080 void MarkCompactCollector::SweepSpace(PagedSpace* space, SweeperType sweeper) { | 4081 void MarkCompactCollector::SweepSpace(PagedSpace* space, SweeperType sweeper) { |
4081 space->set_was_swept_conservatively(sweeper == CONSERVATIVE || | 4082 space->set_is_iterable(sweeper == PRECISE); |
4082 sweeper == PARALLEL_CONSERVATIVE || | 4083 space->set_is_swept_concurrently(sweeper == CONCURRENT_CONSERVATIVE); |
4083 sweeper == CONCURRENT_CONSERVATIVE); | |
4084 space->ClearStats(); | 4084 space->ClearStats(); |
4085 | 4085 |
4086 // We defensively initialize end_of_unswept_pages_ here with the first page | 4086 // We defensively initialize end_of_unswept_pages_ here with the first page |
4087 // of the pages list. | 4087 // of the pages list. |
4088 space->set_end_of_unswept_pages(space->FirstPage()); | 4088 space->set_end_of_unswept_pages(space->FirstPage()); |
4089 | 4089 |
4090 PageIterator it(space); | 4090 PageIterator it(space); |
4091 | 4091 |
4092 int pages_swept = 0; | 4092 int pages_swept = 0; |
4093 bool unused_page_present = false; | 4093 bool unused_page_present = false; |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4489 while (buffer != NULL) { | 4489 while (buffer != NULL) { |
4490 SlotsBuffer* next_buffer = buffer->next(); | 4490 SlotsBuffer* next_buffer = buffer->next(); |
4491 DeallocateBuffer(buffer); | 4491 DeallocateBuffer(buffer); |
4492 buffer = next_buffer; | 4492 buffer = next_buffer; |
4493 } | 4493 } |
4494 *buffer_address = NULL; | 4494 *buffer_address = NULL; |
4495 } | 4495 } |
4496 | 4496 |
4497 | 4497 |
4498 } } // namespace v8::internal | 4498 } } // namespace v8::internal |
OLD | NEW |