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

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

Issue 207613004: Do not left-trim arrays when concurrent sweeping is active. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 bool MarkCompactCollector::AreSweeperThreadsActivated() { 657 bool MarkCompactCollector::AreSweeperThreadsActivated() {
658 return isolate()->sweeper_threads() != NULL || FLAG_job_based_sweeping; 658 return isolate()->sweeper_threads() != NULL || FLAG_job_based_sweeping;
659 } 659 }
660 660
661 661
662 bool MarkCompactCollector::IsConcurrentSweepingInProgress() { 662 bool MarkCompactCollector::IsConcurrentSweepingInProgress() {
663 return sweeping_pending_; 663 return sweeping_pending_;
664 } 664 }
665 665
666 666
667 bool MarkCompactCollector::CanMoveObjectStart(HeapObject* object) {
668 Address address = object->address();
669 bool is_in_old_pointer_space = heap_->InOldPointerSpace(address);
670 bool is_in_old_data_space = heap_->InOldDataSpace(address);
671
672 if (heap_->lo_space()->Contains(object)) return false;
673
674 // We cannot move the object start if the given old space page is
675 // concurrently swept.
676 return (!is_in_old_pointer_space && !is_in_old_data_space) ||
677 Page::FromAddress(address)->parallel_sweeping() <=
678 MemoryChunk::PARALLEL_SWEEPING_FINALIZE;
679 }
Michael Starzinger 2014/03/24 12:21:35 nit: Indentation is off.
Hannes Payer (out of office) 2014/03/25 11:41:08 Done.
680
681
667 void Marking::TransferMark(Address old_start, Address new_start) { 682 void Marking::TransferMark(Address old_start, Address new_start) {
668 // This is only used when resizing an object. 683 // This is only used when resizing an object.
669 ASSERT(MemoryChunk::FromAddress(old_start) == 684 ASSERT(MemoryChunk::FromAddress(old_start) ==
670 MemoryChunk::FromAddress(new_start)); 685 MemoryChunk::FromAddress(new_start));
671 686
672 if (!heap_->incremental_marking()->IsMarking()) return; 687 if (!heap_->incremental_marking()->IsMarking()) return;
673 688
674 // If the mark doesn't move, we don't check the color of the object. 689 // If the mark doesn't move, we don't check the color of the object.
675 // It doesn't matter whether the object is black, since it hasn't changed 690 // It doesn't matter whether the object is black, since it hasn't changed
676 // size, so the adjustment to the live data count will be zero anyway. 691 // size, so the adjustment to the live data count will be zero anyway.
(...skipping 3402 matching lines...) Expand 10 before | Expand all | Expand 10 after
4079 FreeList* free_list = space == heap()->old_pointer_space() 4094 FreeList* free_list = space == heap()->old_pointer_space()
4080 ? free_list_old_pointer_space_.get() 4095 ? free_list_old_pointer_space_.get()
4081 : free_list_old_data_space_.get(); 4096 : free_list_old_data_space_.get();
4082 FreeList private_free_list(space); 4097 FreeList private_free_list(space);
4083 while (it.has_next()) { 4098 while (it.has_next()) {
4084 Page* p = it.next(); 4099 Page* p = it.next();
4085 4100
4086 if (p->TryParallelSweeping()) { 4101 if (p->TryParallelSweeping()) {
4087 SweepConservatively<SWEEP_IN_PARALLEL>(space, &private_free_list, p); 4102 SweepConservatively<SWEEP_IN_PARALLEL>(space, &private_free_list, p);
4088 free_list->Concatenate(&private_free_list); 4103 free_list->Concatenate(&private_free_list);
4104 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_FINALIZE);
4089 } 4105 }
4090 } 4106 }
4091 } 4107 }
4092 4108
4093 4109
4094 void MarkCompactCollector::SweepSpace(PagedSpace* space, SweeperType sweeper) { 4110 void MarkCompactCollector::SweepSpace(PagedSpace* space, SweeperType sweeper) {
4095 space->set_was_swept_conservatively(sweeper == CONSERVATIVE || 4111 space->set_was_swept_conservatively(sweeper == CONSERVATIVE ||
4096 sweeper == LAZY_CONSERVATIVE || 4112 sweeper == LAZY_CONSERVATIVE ||
4097 sweeper == PARALLEL_CONSERVATIVE || 4113 sweeper == PARALLEL_CONSERVATIVE ||
4098 sweeper == CONCURRENT_CONSERVATIVE); 4114 sweeper == CONCURRENT_CONSERVATIVE);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
4277 4293
4278 // Deallocate evacuated candidate pages. 4294 // Deallocate evacuated candidate pages.
4279 ReleaseEvacuationCandidates(); 4295 ReleaseEvacuationCandidates();
4280 } 4296 }
4281 4297
4282 4298
4283 void MarkCompactCollector::ParallelSweepSpaceComplete(PagedSpace* space) { 4299 void MarkCompactCollector::ParallelSweepSpaceComplete(PagedSpace* space) {
4284 PageIterator it(space); 4300 PageIterator it(space);
4285 while (it.has_next()) { 4301 while (it.has_next()) {
4286 Page* p = it.next(); 4302 Page* p = it.next();
4287 if (p->parallel_sweeping() == MemoryChunk::PARALLEL_SWEEPING_IN_PROGRESS) { 4303 if (p->parallel_sweeping() == MemoryChunk::PARALLEL_SWEEPING_FINALIZE) {
4288 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_DONE); 4304 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_DONE);
4289 p->MarkSweptConservatively(); 4305 p->MarkSweptConservatively();
4290 } 4306 }
4307 ASSERT(p->parallel_sweeping() == MemoryChunk::PARALLEL_SWEEPING_DONE);
4291 } 4308 }
4292 } 4309 }
4293 4310
4294 4311
4295 void MarkCompactCollector::ParallelSweepSpacesComplete() { 4312 void MarkCompactCollector::ParallelSweepSpacesComplete() {
4296 ParallelSweepSpaceComplete(heap()->old_pointer_space()); 4313 ParallelSweepSpaceComplete(heap()->old_pointer_space());
4297 ParallelSweepSpaceComplete(heap()->old_data_space()); 4314 ParallelSweepSpaceComplete(heap()->old_data_space());
4298 } 4315 }
4299 4316
4300 4317
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
4518 while (buffer != NULL) { 4535 while (buffer != NULL) {
4519 SlotsBuffer* next_buffer = buffer->next(); 4536 SlotsBuffer* next_buffer = buffer->next();
4520 DeallocateBuffer(buffer); 4537 DeallocateBuffer(buffer);
4521 buffer = next_buffer; 4538 buffer = next_buffer;
4522 } 4539 }
4523 *buffer_address = NULL; 4540 *buffer_address = NULL;
4524 } 4541 }
4525 4542
4526 4543
4527 } } // namespace v8::internal 4544 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698