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

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

Issue 163683003: The sweeper thread should not write the page flags. Added a sweeping complete phase, where the main… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 10 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
« no previous file with comments | « src/mark-compact.h ('k') | src/spaces.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 // 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 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 isolate()->sweeper_threads()[i]->StartSweeping(); 580 isolate()->sweeper_threads()[i]->StartSweeping();
581 } 581 }
582 } 582 }
583 583
584 584
585 void MarkCompactCollector::WaitUntilSweepingCompleted() { 585 void MarkCompactCollector::WaitUntilSweepingCompleted() {
586 ASSERT(sweeping_pending_ == true); 586 ASSERT(sweeping_pending_ == true);
587 for (int i = 0; i < isolate()->num_sweeper_threads(); i++) { 587 for (int i = 0; i < isolate()->num_sweeper_threads(); i++) {
588 isolate()->sweeper_threads()[i]->WaitForSweeperThread(); 588 isolate()->sweeper_threads()[i]->WaitForSweeperThread();
589 } 589 }
590 ParallelSweepSpacesComplete();
590 sweeping_pending_ = false; 591 sweeping_pending_ = false;
591 RefillFreeLists(heap()->paged_space(OLD_DATA_SPACE)); 592 RefillFreeLists(heap()->paged_space(OLD_DATA_SPACE));
592 RefillFreeLists(heap()->paged_space(OLD_POINTER_SPACE)); 593 RefillFreeLists(heap()->paged_space(OLD_POINTER_SPACE));
593 heap()->paged_space(OLD_DATA_SPACE)->ResetUnsweptFreeBytes(); 594 heap()->paged_space(OLD_DATA_SPACE)->ResetUnsweptFreeBytes();
594 heap()->paged_space(OLD_POINTER_SPACE)->ResetUnsweptFreeBytes(); 595 heap()->paged_space(OLD_POINTER_SPACE)->ResetUnsweptFreeBytes();
595 } 596 }
596 597
597 598
598 intptr_t MarkCompactCollector::RefillFreeLists(PagedSpace* space) { 599 intptr_t MarkCompactCollector::RefillFreeLists(PagedSpace* space) {
599 FreeList* free_list; 600 FreeList* free_list;
(...skipping 3304 matching lines...) Expand 10 before | Expand all | Expand 10 after
3904 Page* p) { 3905 Page* p) {
3905 // TODO(hpayer): This check is just used for debugging purpose and 3906 // TODO(hpayer): This check is just used for debugging purpose and
3906 // should be removed or turned into an assert after investigating the 3907 // should be removed or turned into an assert after investigating the
3907 // crash in concurrent sweeping. 3908 // crash in concurrent sweeping.
3908 CHECK(!p->IsEvacuationCandidate() && !p->WasSwept()); 3909 CHECK(!p->IsEvacuationCandidate() && !p->WasSwept());
3909 ASSERT((mode == MarkCompactCollector::SWEEP_IN_PARALLEL && 3910 ASSERT((mode == MarkCompactCollector::SWEEP_IN_PARALLEL &&
3910 free_list != NULL) || 3911 free_list != NULL) ||
3911 (mode == MarkCompactCollector::SWEEP_SEQUENTIALLY && 3912 (mode == MarkCompactCollector::SWEEP_SEQUENTIALLY &&
3912 free_list == NULL)); 3913 free_list == NULL));
3913 3914
3914 p->MarkSweptConservatively(); 3915 // When parallel sweeping is active, the page will be marked after
3916 // sweeping by the main thread.
3917 if (mode != MarkCompactCollector::SWEEP_IN_PARALLEL) {
3918 p->MarkSweptConservatively();
3919 }
3915 3920
3916 intptr_t freed_bytes = 0; 3921 intptr_t freed_bytes = 0;
3917 size_t size = 0; 3922 size_t size = 0;
3918 3923
3919 // Skip over all the dead objects at the start of the page and mark them free. 3924 // Skip over all the dead objects at the start of the page and mark them free.
3920 Address cell_base = 0; 3925 Address cell_base = 0;
3921 MarkBit::CellType* cell = NULL; 3926 MarkBit::CellType* cell = NULL;
3922 MarkBitCellIterator it(p); 3927 MarkBitCellIterator it(p);
3923 for (; !it.Done(); it.Advance()) { 3928 for (; !it.Done(); it.Advance()) {
3924 cell_base = it.CurrentCellBase(); 3929 cell_base = it.CurrentCellBase();
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
4016 PageIterator it(space); 4021 PageIterator it(space);
4017 4022
4018 int pages_swept = 0; 4023 int pages_swept = 0;
4019 bool lazy_sweeping_active = false; 4024 bool lazy_sweeping_active = false;
4020 bool unused_page_present = false; 4025 bool unused_page_present = false;
4021 bool parallel_sweeping_active = false; 4026 bool parallel_sweeping_active = false;
4022 4027
4023 while (it.has_next()) { 4028 while (it.has_next()) {
4024 Page* p = it.next(); 4029 Page* p = it.next();
4025 4030
4026 ASSERT(p->parallel_sweeping() == 0); 4031 ASSERT(p->parallel_sweeping() == MemoryChunk::PARALLEL_SWEEPING_DONE);
4027 ASSERT(!p->IsEvacuationCandidate()); 4032 ASSERT(!p->IsEvacuationCandidate());
4028 4033
4029 // Clear sweeping flags indicating that marking bits are still intact. 4034 // Clear sweeping flags indicating that marking bits are still intact.
4030 p->ClearSweptPrecisely(); 4035 p->ClearSweptPrecisely();
4031 p->ClearSweptConservatively(); 4036 p->ClearSweptConservatively();
4032 4037
4033 if (p->IsFlagSet(Page::RESCAN_ON_EVACUATION)) { 4038 if (p->IsFlagSet(Page::RESCAN_ON_EVACUATION)) {
4034 // Will be processed in EvacuateNewSpaceAndCandidates. 4039 // Will be processed in EvacuateNewSpaceAndCandidates.
4035 ASSERT(evacuation_candidates_.length() > 0); 4040 ASSERT(evacuation_candidates_.length() > 0);
4036 continue; 4041 continue;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4089 reinterpret_cast<intptr_t>(p)); 4094 reinterpret_cast<intptr_t>(p));
4090 } 4095 }
4091 SweepConservatively<SWEEP_SEQUENTIALLY>(space, NULL, p); 4096 SweepConservatively<SWEEP_SEQUENTIALLY>(space, NULL, p);
4092 pages_swept++; 4097 pages_swept++;
4093 parallel_sweeping_active = true; 4098 parallel_sweeping_active = true;
4094 } else { 4099 } else {
4095 if (FLAG_gc_verbose) { 4100 if (FLAG_gc_verbose) {
4096 PrintF("Sweeping 0x%" V8PRIxPTR " conservatively in parallel.\n", 4101 PrintF("Sweeping 0x%" V8PRIxPTR " conservatively in parallel.\n",
4097 reinterpret_cast<intptr_t>(p)); 4102 reinterpret_cast<intptr_t>(p));
4098 } 4103 }
4099 p->set_parallel_sweeping(1); 4104 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_PENDING);
4100 space->IncreaseUnsweptFreeBytes(p); 4105 space->IncreaseUnsweptFreeBytes(p);
4101 } 4106 }
4102 break; 4107 break;
4103 } 4108 }
4104 case PRECISE: { 4109 case PRECISE: {
4105 if (FLAG_gc_verbose) { 4110 if (FLAG_gc_verbose) {
4106 PrintF("Sweeping 0x%" V8PRIxPTR " precisely.\n", 4111 PrintF("Sweeping 0x%" V8PRIxPTR " precisely.\n",
4107 reinterpret_cast<intptr_t>(p)); 4112 reinterpret_cast<intptr_t>(p));
4108 } 4113 }
4109 if (space->identity() == CODE_SPACE) { 4114 if (space->identity() == CODE_SPACE) {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
4181 SweepSpace(heap()->map_space(), PRECISE); 4186 SweepSpace(heap()->map_space(), PRECISE);
4182 4187
4183 // Deallocate unmarked objects and clear marked bits for marked objects. 4188 // Deallocate unmarked objects and clear marked bits for marked objects.
4184 heap_->lo_space()->FreeUnmarkedObjects(); 4189 heap_->lo_space()->FreeUnmarkedObjects();
4185 4190
4186 // Deallocate evacuated candidate pages. 4191 // Deallocate evacuated candidate pages.
4187 ReleaseEvacuationCandidates(); 4192 ReleaseEvacuationCandidates();
4188 } 4193 }
4189 4194
4190 4195
4196 void MarkCompactCollector::ParallelSweepSpaceComplete(PagedSpace* space) {
4197 PageIterator it(space);
4198 while (it.has_next()) {
4199 Page* p = it.next();
4200 if (p->parallel_sweeping() == MemoryChunk::PARALLEL_SWEEPING_IN_PROGRESS) {
4201 p->set_parallel_sweeping(MemoryChunk::PARALLEL_SWEEPING_DONE);
4202 p->MarkSweptConservatively();
4203 }
4204 }
4205 }
4206
4207
4208 void MarkCompactCollector::ParallelSweepSpacesComplete() {
4209 ParallelSweepSpaceComplete(heap()->old_pointer_space());
4210 ParallelSweepSpaceComplete(heap()->old_data_space());
4211 }
4212
4213
4191 void MarkCompactCollector::EnableCodeFlushing(bool enable) { 4214 void MarkCompactCollector::EnableCodeFlushing(bool enable) {
4192 #ifdef ENABLE_DEBUGGER_SUPPORT 4215 #ifdef ENABLE_DEBUGGER_SUPPORT
4193 if (isolate()->debug()->IsLoaded() || 4216 if (isolate()->debug()->IsLoaded() ||
4194 isolate()->debug()->has_break_points()) { 4217 isolate()->debug()->has_break_points()) {
4195 enable = false; 4218 enable = false;
4196 } 4219 }
4197 #endif 4220 #endif
4198 4221
4199 if (enable) { 4222 if (enable) {
4200 if (code_flusher_ != NULL) return; 4223 if (code_flusher_ != NULL) return;
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
4389 while (buffer != NULL) { 4412 while (buffer != NULL) {
4390 SlotsBuffer* next_buffer = buffer->next(); 4413 SlotsBuffer* next_buffer = buffer->next();
4391 DeallocateBuffer(buffer); 4414 DeallocateBuffer(buffer);
4392 buffer = next_buffer; 4415 buffer = next_buffer;
4393 } 4416 }
4394 *buffer_address = NULL; 4417 *buffer_address = NULL;
4395 } 4418 }
4396 4419
4397 4420
4398 } } // namespace v8::internal 4421 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mark-compact.h ('k') | src/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698