Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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/spaces.h" | 5 #include "src/heap/spaces.h" |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/base/platform/platform.h" | 8 #include "src/base/platform/platform.h" |
| 9 #include "src/full-codegen/full-codegen.h" | 9 #include "src/full-codegen/full-codegen.h" |
| 10 #include "src/heap/slots-buffer.h" | 10 #include "src/heap/slots-buffer.h" |
| (...skipping 2368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2379 DCHECK(size_in_bytes <= kMaxBlockSize); | 2379 DCHECK(size_in_bytes <= kMaxBlockSize); |
| 2380 DCHECK(IsAligned(size_in_bytes, kPointerSize)); | 2380 DCHECK(IsAligned(size_in_bytes, kPointerSize)); |
| 2381 // Don't free list allocate if there is linear space available. | 2381 // Don't free list allocate if there is linear space available. |
| 2382 DCHECK(owner_->limit() - owner_->top() < size_in_bytes); | 2382 DCHECK(owner_->limit() - owner_->top() < size_in_bytes); |
| 2383 | 2383 |
| 2384 int old_linear_size = static_cast<int>(owner_->limit() - owner_->top()); | 2384 int old_linear_size = static_cast<int>(owner_->limit() - owner_->top()); |
| 2385 // Mark the old linear allocation area with a free space map so it can be | 2385 // Mark the old linear allocation area with a free space map so it can be |
| 2386 // skipped when scanning the heap. This also puts it back in the free list | 2386 // skipped when scanning the heap. This also puts it back in the free list |
| 2387 // if it is big enough. | 2387 // if it is big enough. |
| 2388 owner_->Free(owner_->top(), old_linear_size); | 2388 owner_->Free(owner_->top(), old_linear_size); |
| 2389 owner_->SetTopAndLimit(nullptr, nullptr); | |
| 2389 | 2390 |
| 2390 owner_->heap()->incremental_marking()->OldSpaceStep(size_in_bytes - | 2391 owner_->heap()->incremental_marking()->OldSpaceStep(size_in_bytes - |
|
Michael Lippautz
2015/09/24 16:39:53
SizeOfObjects() > 0 is a condition to start increm
Hannes Payer (out of office)
2015/09/25 08:33:09
Good catch!
| |
| 2391 old_linear_size); | 2392 old_linear_size); |
| 2392 | 2393 |
| 2393 int new_node_size = 0; | 2394 int new_node_size = 0; |
| 2394 FreeSpace* new_node = FindNodeFor(size_in_bytes, &new_node_size); | 2395 FreeSpace* new_node = FindNodeFor(size_in_bytes, &new_node_size); |
| 2395 if (new_node == NULL) { | 2396 if (new_node == nullptr) return nullptr; |
| 2396 owner_->SetTopAndLimit(NULL, NULL); | |
| 2397 return NULL; | |
| 2398 } | |
| 2399 | 2397 |
| 2400 int bytes_left = new_node_size - size_in_bytes; | 2398 int bytes_left = new_node_size - size_in_bytes; |
| 2401 DCHECK(bytes_left >= 0); | 2399 DCHECK(bytes_left >= 0); |
| 2402 | 2400 |
| 2403 #ifdef DEBUG | 2401 #ifdef DEBUG |
| 2404 for (int i = 0; i < size_in_bytes / kPointerSize; i++) { | 2402 for (int i = 0; i < size_in_bytes / kPointerSize; i++) { |
| 2405 reinterpret_cast<Object**>(new_node->address())[i] = | 2403 reinterpret_cast<Object**>(new_node->address())[i] = |
| 2406 Smi::FromInt(kCodeZapValue); | 2404 Smi::FromInt(kCodeZapValue); |
| 2407 } | 2405 } |
| 2408 #endif | 2406 #endif |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 2432 // we want to do another increment until the linear area is used up. | 2430 // we want to do another increment until the linear area is used up. |
| 2433 owner_->Free(new_node->address() + size_in_bytes + linear_size, | 2431 owner_->Free(new_node->address() + size_in_bytes + linear_size, |
| 2434 new_node_size - size_in_bytes - linear_size); | 2432 new_node_size - size_in_bytes - linear_size); |
| 2435 owner_->SetTopAndLimit(new_node->address() + size_in_bytes, | 2433 owner_->SetTopAndLimit(new_node->address() + size_in_bytes, |
| 2436 new_node->address() + size_in_bytes + linear_size); | 2434 new_node->address() + size_in_bytes + linear_size); |
| 2437 } else if (bytes_left > 0) { | 2435 } else if (bytes_left > 0) { |
| 2438 // Normally we give the rest of the node to the allocator as its new | 2436 // Normally we give the rest of the node to the allocator as its new |
| 2439 // linear allocation area. | 2437 // linear allocation area. |
| 2440 owner_->SetTopAndLimit(new_node->address() + size_in_bytes, | 2438 owner_->SetTopAndLimit(new_node->address() + size_in_bytes, |
| 2441 new_node->address() + new_node_size); | 2439 new_node->address() + new_node_size); |
| 2442 } else { | |
| 2443 // TODO(gc) Try not freeing linear allocation region when bytes_left | |
| 2444 // are zero. | |
| 2445 owner_->SetTopAndLimit(NULL, NULL); | |
| 2446 } | 2440 } |
| 2447 | 2441 |
| 2448 return new_node; | 2442 return new_node; |
| 2449 } | 2443 } |
| 2450 | 2444 |
| 2451 | 2445 |
| 2452 intptr_t FreeList::EvictFreeListItems(Page* p) { | 2446 intptr_t FreeList::EvictFreeListItems(Page* p) { |
| 2453 intptr_t sum = huge_list_.EvictFreeListItemsInList(p); | 2447 intptr_t sum = huge_list_.EvictFreeListItemsInList(p); |
| 2454 p->set_available_in_huge_free_list(0); | 2448 p->set_available_in_huge_free_list(0); |
| 2455 | 2449 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2546 | 2540 |
| 2547 // Clear the free list before a full GC---it will be rebuilt afterward. | 2541 // Clear the free list before a full GC---it will be rebuilt afterward. |
| 2548 free_list_.Reset(); | 2542 free_list_.Reset(); |
| 2549 } | 2543 } |
| 2550 | 2544 |
| 2551 | 2545 |
| 2552 intptr_t PagedSpace::SizeOfObjects() { | 2546 intptr_t PagedSpace::SizeOfObjects() { |
| 2553 DCHECK(!FLAG_concurrent_sweeping || | 2547 DCHECK(!FLAG_concurrent_sweeping || |
| 2554 heap()->mark_compact_collector()->sweeping_in_progress() || | 2548 heap()->mark_compact_collector()->sweeping_in_progress() || |
| 2555 (unswept_free_bytes_ == 0)); | 2549 (unswept_free_bytes_ == 0)); |
| 2556 return Size() - unswept_free_bytes_ - (limit() - top()); | 2550 intptr_t size = Size() - unswept_free_bytes_ - (limit() - top()); |
| 2551 CHECK_GE(size, 0); | |
|
Michael Lippautz
2015/09/24 16:39:54
If possible, I'd like to keep this here to catch p
Hannes Payer (out of office)
2015/09/25 08:33:08
I guess a DCHECK would be sufficient. If you keep
Michael Lippautz
2015/09/25 09:05:17
Let's make it a DCHECK for now as I am anyways tes
| |
| 2552 return size; | |
| 2557 } | 2553 } |
| 2558 | 2554 |
| 2559 | 2555 |
| 2560 // After we have booted, we have created a map which represents free space | 2556 // After we have booted, we have created a map which represents free space |
| 2561 // on the heap. If there was already a free list then the elements on it | 2557 // on the heap. If there was already a free list then the elements on it |
| 2562 // were created with the wrong FreeSpaceMap (normally NULL), so we need to | 2558 // were created with the wrong FreeSpaceMap (normally NULL), so we need to |
| 2563 // fix them. | 2559 // fix them. |
| 2564 void PagedSpace::RepairFreeListsAfterDeserialization() { | 2560 void PagedSpace::RepairFreeListsAfterDeserialization() { |
| 2565 free_list_.RepairLists(heap()); | 2561 free_list_.RepairLists(heap()); |
| 2566 // Each page may have a small free space that is not tracked by a free list. | 2562 // Each page may have a small free space that is not tracked by a free list. |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3144 object->ShortPrint(); | 3140 object->ShortPrint(); |
| 3145 PrintF("\n"); | 3141 PrintF("\n"); |
| 3146 } | 3142 } |
| 3147 printf(" --------------------------------------\n"); | 3143 printf(" --------------------------------------\n"); |
| 3148 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3144 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
| 3149 } | 3145 } |
| 3150 | 3146 |
| 3151 #endif // DEBUG | 3147 #endif // DEBUG |
| 3152 } // namespace internal | 3148 } // namespace internal |
| 3153 } // namespace v8 | 3149 } // namespace v8 |
| OLD | NEW |