| 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/code-stubs.h" | 9 #include "src/code-stubs.h" | 
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" | 
| (...skipping 3158 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3169   while (it.has_next()) { | 3169   while (it.has_next()) { | 
| 3170     NewSpacePage* p = it.next(); | 3170     NewSpacePage* p = it.next(); | 
| 3171     survivors_size += DiscoverAndEvacuateBlackObjectsOnPage(new_space, p); | 3171     survivors_size += DiscoverAndEvacuateBlackObjectsOnPage(new_space, p); | 
| 3172   } | 3172   } | 
| 3173 | 3173 | 
| 3174   heap_->IncrementYoungSurvivorsCounter(survivors_size); | 3174   heap_->IncrementYoungSurvivorsCounter(survivors_size); | 
| 3175   new_space->set_age_mark(new_space->top()); | 3175   new_space->set_age_mark(new_space->top()); | 
| 3176 } | 3176 } | 
| 3177 | 3177 | 
| 3178 | 3178 | 
| 3179 void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p) { | 3179 void MarkCompactCollector::EvacuateLiveObjectsFromPage(Page* p, | 
|  | 3180                                                        PagedSpace* to_space) { | 
| 3180   AlwaysAllocateScope always_allocate(isolate()); | 3181   AlwaysAllocateScope always_allocate(isolate()); | 
| 3181   PagedSpace* space = static_cast<PagedSpace*>(p->owner()); |  | 
| 3182   DCHECK(p->IsEvacuationCandidate() && !p->WasSwept()); | 3182   DCHECK(p->IsEvacuationCandidate() && !p->WasSwept()); | 
| 3183   p->SetWasSwept(); | 3183   p->SetWasSwept(); | 
| 3184 | 3184 | 
| 3185   int offsets[16]; | 3185   int offsets[16]; | 
| 3186 | 3186 | 
| 3187   for (MarkBitCellIterator it(p); !it.Done(); it.Advance()) { | 3187   for (MarkBitCellIterator it(p); !it.Done(); it.Advance()) { | 
| 3188     Address cell_base = it.CurrentCellBase(); | 3188     Address cell_base = it.CurrentCellBase(); | 
| 3189     MarkBit::CellType* cell = it.CurrentCell(); | 3189     MarkBit::CellType* cell = it.CurrentCell(); | 
| 3190 | 3190 | 
| 3191     if (*cell == 0) continue; | 3191     if (*cell == 0) continue; | 
| 3192 | 3192 | 
| 3193     int live_objects = MarkWordToObjectStarts(*cell, offsets); | 3193     int live_objects = MarkWordToObjectStarts(*cell, offsets); | 
| 3194     for (int i = 0; i < live_objects; i++) { | 3194     for (int i = 0; i < live_objects; i++) { | 
| 3195       Address object_addr = cell_base + offsets[i] * kPointerSize; | 3195       Address object_addr = cell_base + offsets[i] * kPointerSize; | 
| 3196       HeapObject* object = HeapObject::FromAddress(object_addr); | 3196       HeapObject* object = HeapObject::FromAddress(object_addr); | 
| 3197       DCHECK(Marking::IsBlack(Marking::MarkBitFrom(object))); | 3197       DCHECK(Marking::IsBlack(Marking::MarkBitFrom(object))); | 
| 3198 | 3198 | 
| 3199       int size = object->Size(); | 3199       int size = object->Size(); | 
| 3200       AllocationAlignment alignment = object->RequiredAlignment(); | 3200       AllocationAlignment alignment = object->RequiredAlignment(); | 
| 3201       HeapObject* target_object = nullptr; | 3201       HeapObject* target_object = nullptr; | 
| 3202       AllocationResult allocation = space->AllocateRaw(size, alignment); | 3202       AllocationResult allocation = to_space->AllocateRaw(size, alignment); | 
| 3203       if (!allocation.To(&target_object)) { | 3203       if (!allocation.To(&target_object)) { | 
| 3204         // If allocation failed, use emergency memory and re-try allocation. | 3204         // If allocation failed, use emergency memory and re-try allocation. | 
| 3205         CHECK(space->HasEmergencyMemory()); | 3205         CHECK(to_space->HasEmergencyMemory()); | 
| 3206         space->UseEmergencyMemory(); | 3206         to_space->UseEmergencyMemory(); | 
| 3207         allocation = space->AllocateRaw(size, alignment); | 3207         allocation = to_space->AllocateRaw(size, alignment); | 
| 3208       } | 3208       } | 
| 3209       if (!allocation.To(&target_object)) { | 3209       if (!allocation.To(&target_object)) { | 
| 3210         // OS refused to give us memory. | 3210         // OS refused to give us memory. | 
| 3211         V8::FatalProcessOutOfMemory("Evacuation"); | 3211         V8::FatalProcessOutOfMemory("Evacuation"); | 
| 3212         return; | 3212         return; | 
| 3213       } | 3213       } | 
| 3214 | 3214 | 
| 3215       MigrateObject(target_object, object, size, space->identity()); | 3215       MigrateObject(target_object, object, size, to_space->identity()); | 
| 3216       DCHECK(object->map_word().IsForwardingAddress()); | 3216       DCHECK(object->map_word().IsForwardingAddress()); | 
| 3217     } | 3217     } | 
| 3218 | 3218 | 
| 3219     // Clear marking bits for current cell. | 3219     // Clear marking bits for current cell. | 
| 3220     *cell = 0; | 3220     *cell = 0; | 
| 3221   } | 3221   } | 
| 3222   p->ResetLiveBytes(); | 3222   p->ResetLiveBytes(); | 
| 3223 } | 3223 } | 
| 3224 | 3224 | 
| 3225 | 3225 | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 3249     // Allocate emergency memory for the case when compaction fails due to out | 3249     // Allocate emergency memory for the case when compaction fails due to out | 
| 3250     // of memory. | 3250     // of memory. | 
| 3251     if (!space->HasEmergencyMemory()) { | 3251     if (!space->HasEmergencyMemory()) { | 
| 3252       space->CreateEmergencyMemory();  // If the OS lets us. | 3252       space->CreateEmergencyMemory();  // If the OS lets us. | 
| 3253     } | 3253     } | 
| 3254     if (p->IsEvacuationCandidate()) { | 3254     if (p->IsEvacuationCandidate()) { | 
| 3255       // During compaction we might have to request a new page in order to free | 3255       // During compaction we might have to request a new page in order to free | 
| 3256       // up a page.  Check that we actually got an emergency page above so we | 3256       // up a page.  Check that we actually got an emergency page above so we | 
| 3257       // can guarantee that this succeeds. | 3257       // can guarantee that this succeeds. | 
| 3258       if (space->HasEmergencyMemory()) { | 3258       if (space->HasEmergencyMemory()) { | 
| 3259         EvacuateLiveObjectsFromPage(p); | 3259         EvacuateLiveObjectsFromPage(p, static_cast<PagedSpace*>(p->owner())); | 
| 3260         // Unlink the page from the list of pages here. We must not iterate | 3260         // Unlink the page from the list of pages here. We must not iterate | 
| 3261         // over that page later (e.g. when scan on scavenge pages are | 3261         // over that page later (e.g. when scan on scavenge pages are | 
| 3262         // processed). The page itself will be freed later and is still | 3262         // processed). The page itself will be freed later and is still | 
| 3263         // reachable from the evacuation candidates list. | 3263         // reachable from the evacuation candidates list. | 
| 3264         p->Unlink(); | 3264         p->Unlink(); | 
| 3265       } else { | 3265       } else { | 
| 3266         // Without room for expansion evacuation is not guaranteed to succeed. | 3266         // Without room for expansion evacuation is not guaranteed to succeed. | 
| 3267         // Pessimistically abandon unevacuated pages. | 3267         // Pessimistically abandon unevacuated pages. | 
| 3268         for (int j = i; j < npages; j++) { | 3268         for (int j = i; j < npages; j++) { | 
| 3269           Page* page = evacuation_candidates_[j]; | 3269           Page* page = evacuation_candidates_[j]; | 
| (...skipping 1401 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4671   SlotsBuffer* buffer = *buffer_address; | 4671   SlotsBuffer* buffer = *buffer_address; | 
| 4672   while (buffer != NULL) { | 4672   while (buffer != NULL) { | 
| 4673     SlotsBuffer* next_buffer = buffer->next(); | 4673     SlotsBuffer* next_buffer = buffer->next(); | 
| 4674     DeallocateBuffer(buffer); | 4674     DeallocateBuffer(buffer); | 
| 4675     buffer = next_buffer; | 4675     buffer = next_buffer; | 
| 4676   } | 4676   } | 
| 4677   *buffer_address = NULL; | 4677   *buffer_address = NULL; | 
| 4678 } | 4678 } | 
| 4679 }  // namespace internal | 4679 }  // namespace internal | 
| 4680 }  // namespace v8 | 4680 }  // namespace v8 | 
| OLD | NEW | 
|---|