| 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/v8.h" | 5 #include "src/v8.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.h" | 9 #include "src/full-codegen.h" |
| 10 #include "src/heap/mark-compact.h" | 10 #include "src/heap/mark-compact.h" |
| (...skipping 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 | 1012 |
| 1013 UNREACHABLE(); | 1013 UNREACHABLE(); |
| 1014 return Smi::FromInt(0); | 1014 return Smi::FromInt(0); |
| 1015 } | 1015 } |
| 1016 | 1016 |
| 1017 | 1017 |
| 1018 bool PagedSpace::CanExpand() { | 1018 bool PagedSpace::CanExpand() { |
| 1019 DCHECK(max_capacity_ % AreaSize() == 0); | 1019 DCHECK(max_capacity_ % AreaSize() == 0); |
| 1020 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); | 1020 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); |
| 1021 DCHECK(heap()->CommittedOldGenerationMemory() <= | 1021 DCHECK(heap()->CommittedOldGenerationMemory() <= |
| 1022 heap()->MaxOldGenerationSize()); | 1022 heap()->MaxOldGenerationSize() + |
| 1023 PagedSpace::MaxEmergencyMemoryAllocated()); |
| 1023 | 1024 |
| 1024 // Are we going to exceed capacity for this space? | 1025 // Are we going to exceed capacity for this space? |
| 1025 if (!heap()->CanExpandOldGeneration(Page::kPageSize)) return false; | 1026 if (!heap()->CanExpandOldGeneration(Page::kPageSize)) return false; |
| 1026 | 1027 |
| 1027 return true; | 1028 return true; |
| 1028 } | 1029 } |
| 1029 | 1030 |
| 1030 | 1031 |
| 1031 bool PagedSpace::Expand() { | 1032 bool PagedSpace::Expand() { |
| 1032 if (!CanExpand()) return false; | 1033 if (!CanExpand()) return false; |
| 1033 | 1034 |
| 1034 intptr_t size = AreaSize(); | 1035 intptr_t size = AreaSize(); |
| 1035 | 1036 |
| 1036 if (anchor_.next_page() == &anchor_) { | 1037 if (anchor_.next_page() == &anchor_) { |
| 1037 size = Snapshot::SizeOfFirstPage(heap()->isolate(), identity()); | 1038 size = Snapshot::SizeOfFirstPage(heap()->isolate(), identity()); |
| 1038 } | 1039 } |
| 1039 | 1040 |
| 1040 Page* p = heap()->isolate()->memory_allocator()->AllocatePage(size, this, | 1041 Page* p = heap()->isolate()->memory_allocator()->AllocatePage(size, this, |
| 1041 executable()); | 1042 executable()); |
| 1042 if (p == NULL) return false; | 1043 if (p == NULL) return false; |
| 1043 | 1044 |
| 1044 // Pages created during bootstrapping may contain immortal immovable objects. | 1045 // Pages created during bootstrapping may contain immortal immovable objects. |
| 1045 if (!heap()->deserialization_complete()) p->MarkNeverEvacuate(); | 1046 if (!heap()->deserialization_complete()) p->MarkNeverEvacuate(); |
| 1046 | 1047 |
| 1047 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); | 1048 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); |
| 1048 DCHECK(heap()->CommittedOldGenerationMemory() <= | 1049 DCHECK(heap()->CommittedOldGenerationMemory() <= |
| 1049 heap()->MaxOldGenerationSize()); | 1050 heap()->MaxOldGenerationSize() + |
| 1051 PagedSpace::MaxEmergencyMemoryAllocated()); |
| 1050 | 1052 |
| 1051 p->InsertAfter(anchor_.prev_page()); | 1053 p->InsertAfter(anchor_.prev_page()); |
| 1052 | 1054 |
| 1053 return true; | 1055 return true; |
| 1054 } | 1056 } |
| 1055 | 1057 |
| 1056 | 1058 |
| 1057 int PagedSpace::CountTotalPages() { | 1059 int PagedSpace::CountTotalPages() { |
| 1058 PageIterator it(this); | 1060 PageIterator it(this); |
| 1059 int count = 0; | 1061 int count = 0; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 heap()->isolate()->memory_allocator()->Free(page); | 1123 heap()->isolate()->memory_allocator()->Free(page); |
| 1122 } else { | 1124 } else { |
| 1123 heap()->QueueMemoryChunkForFree(page); | 1125 heap()->QueueMemoryChunkForFree(page); |
| 1124 } | 1126 } |
| 1125 | 1127 |
| 1126 DCHECK(Capacity() > 0); | 1128 DCHECK(Capacity() > 0); |
| 1127 accounting_stats_.ShrinkSpace(AreaSize()); | 1129 accounting_stats_.ShrinkSpace(AreaSize()); |
| 1128 } | 1130 } |
| 1129 | 1131 |
| 1130 | 1132 |
| 1133 intptr_t PagedSpace::MaxEmergencyMemoryAllocated() { |
| 1134 // New space and large object space. |
| 1135 static const int spaces_without_emergency_memory = 2; |
| 1136 static const int spaces_with_emergency_memory = |
| 1137 LAST_SPACE - FIRST_SPACE + 1 - spaces_without_emergency_memory; |
| 1138 return Page::kPageSize * spaces_with_emergency_memory; |
| 1139 } |
| 1140 |
| 1141 |
| 1131 void PagedSpace::CreateEmergencyMemory() { | 1142 void PagedSpace::CreateEmergencyMemory() { |
| 1132 if (identity() == CODE_SPACE) { | 1143 if (identity() == CODE_SPACE) { |
| 1133 // Make the emergency block available to the allocator. | 1144 // Make the emergency block available to the allocator. |
| 1134 CodeRange* code_range = heap()->isolate()->code_range(); | 1145 CodeRange* code_range = heap()->isolate()->code_range(); |
| 1135 if (code_range != NULL && code_range->valid()) { | 1146 if (code_range != NULL && code_range->valid()) { |
| 1136 code_range->ReleaseEmergencyBlock(); | 1147 code_range->ReleaseEmergencyBlock(); |
| 1137 } | 1148 } |
| 1138 DCHECK(MemoryAllocator::CodePageAreaSize() == AreaSize()); | 1149 DCHECK(MemoryAllocator::CodePageAreaSize() == AreaSize()); |
| 1139 } | 1150 } |
| 1140 emergency_memory_ = heap()->isolate()->memory_allocator()->AllocateChunk( | 1151 emergency_memory_ = heap()->isolate()->memory_allocator()->AllocateChunk( |
| (...skipping 1990 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3131 object->ShortPrint(); | 3142 object->ShortPrint(); |
| 3132 PrintF("\n"); | 3143 PrintF("\n"); |
| 3133 } | 3144 } |
| 3134 printf(" --------------------------------------\n"); | 3145 printf(" --------------------------------------\n"); |
| 3135 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3146 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
| 3136 } | 3147 } |
| 3137 | 3148 |
| 3138 #endif // DEBUG | 3149 #endif // DEBUG |
| 3139 } | 3150 } |
| 3140 } // namespace v8::internal | 3151 } // namespace v8::internal |
| OLD | NEW |