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/base/platform/semaphore.h" | 9 #include "src/base/platform/semaphore.h" |
| 10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
| (...skipping 1195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1206 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { | 1206 for (HeapObject* obj = it.Next(); obj != NULL; obj = it.Next()) { |
| 1207 Address cur = obj->address(); | 1207 Address cur = obj->address(); |
| 1208 Address next = cur + obj->Size(); | 1208 Address next = cur + obj->Size(); |
| 1209 if ((cur <= addr) && (addr < next)) return obj; | 1209 if ((cur <= addr) && (addr < next)) return obj; |
| 1210 } | 1210 } |
| 1211 | 1211 |
| 1212 UNREACHABLE(); | 1212 UNREACHABLE(); |
| 1213 return Smi::FromInt(0); | 1213 return Smi::FromInt(0); |
| 1214 } | 1214 } |
| 1215 | 1215 |
| 1216 int PagedSpace::AreaSizeDuringDeserialization() { | |
| 1217 // Try to keep the memory as compact as possible for a snapshot. This way the | |
| 1218 // heap stays small for small/empty scripts. | |
| 1219 DCHECK(snapshotable()); | |
| 1220 DCHECK(!heap()->deserialization_complete()); | |
| 1221 uint32_t snapshot_requires = | |
| 1222 Snapshot::SizeOfSnapshot(heap()->isolate(), identity()); | |
| 1223 if (snapshot_requires > 0) { | |
|
Hannes Payer (out of office)
2016/08/08 16:25:02
I think this if case should be a DCHECK and the el
Michael Lippautz
2016/08/09 11:30:25
Obsolete.
| |
| 1224 // Count how much we have served already. | |
| 1225 size_t memory_served = 0; | |
| 1226 for (Page* page : *this) { | |
| 1227 memory_served += page->area_size(); | |
|
Hannes Payer (out of office)
2016/08/08 16:25:02
size of actual objects would be more precise here.
Michael Lippautz
2016/08/09 11:30:25
Obsolete.
| |
| 1228 } | |
| 1229 size_t needed = static_cast<size_t>(snapshot_requires) - memory_served; | |
| 1230 const int area_size = MemoryAllocator::PageAreaSize(identity()); | |
|
Hannes Payer (out of office)
2016/08/08 16:25:02
Just call AreaSize() here.
Michael Lippautz
2016/08/09 11:30:25
Obsolete.
| |
| 1231 if (needed >= static_cast<size_t>(area_size)) return area_size; | |
| 1232 // Less than a page of memory needed. We need to allocate at least | |
| 1233 // kMaxRegularHeapObjectSize of space. | |
| 1234 if (needed < Page::kMaxRegularHeapObjectSize) | |
| 1235 return Page::kMaxRegularHeapObjectSize; | |
| 1236 return static_cast<int>(needed); | |
|
Hannes Payer (out of office)
2016/08/08 16:25:02
Maybe we should do a different approach here:
How
Michael Lippautz
2016/08/09 11:30:25
Done.
| |
| 1237 } | |
| 1238 return AreaSize(); | |
| 1239 } | |
| 1240 | |
| 1216 bool PagedSpace::Expand() { | 1241 bool PagedSpace::Expand() { |
| 1217 int size = AreaSize(); | 1242 int size = heap()->deserialization_complete() |
| 1218 if (snapshotable() && !HasPages()) { | 1243 ? AreaSize() |
| 1219 size = Snapshot::SizeOfFirstPage(heap()->isolate(), identity()); | 1244 : AreaSizeDuringDeserialization(); |
| 1220 } | |
| 1221 | 1245 |
| 1222 if (!heap()->CanExpandOldGeneration(size)) return false; | 1246 if (!heap()->CanExpandOldGeneration(size)) return false; |
| 1223 | |
| 1224 Page* p = heap()->memory_allocator()->AllocatePage(size, this, executable()); | 1247 Page* p = heap()->memory_allocator()->AllocatePage(size, this, executable()); |
| 1225 if (p == nullptr) return false; | 1248 if (p == nullptr) return false; |
| 1226 | |
| 1227 AccountCommitted(static_cast<intptr_t>(p->size())); | 1249 AccountCommitted(static_cast<intptr_t>(p->size())); |
| 1228 | 1250 |
| 1229 // Pages created during bootstrapping may contain immortal immovable objects. | 1251 // Pages created during bootstrapping may contain immortal immovable objects. |
| 1230 if (!heap()->deserialization_complete()) p->MarkNeverEvacuate(); | 1252 if (!heap()->deserialization_complete()) p->MarkNeverEvacuate(); |
| 1231 | 1253 |
| 1232 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); | 1254 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); |
| 1233 | 1255 |
| 1234 p->InsertAfter(anchor_.prev_page()); | 1256 p->InsertAfter(anchor_.prev_page()); |
| 1235 | 1257 |
| 1236 return true; | 1258 return true; |
| (...skipping 1895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3132 object->ShortPrint(); | 3154 object->ShortPrint(); |
| 3133 PrintF("\n"); | 3155 PrintF("\n"); |
| 3134 } | 3156 } |
| 3135 printf(" --------------------------------------\n"); | 3157 printf(" --------------------------------------\n"); |
| 3136 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3158 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
| 3137 } | 3159 } |
| 3138 | 3160 |
| 3139 #endif // DEBUG | 3161 #endif // DEBUG |
| 3140 } // namespace internal | 3162 } // namespace internal |
| 3141 } // namespace v8 | 3163 } // namespace v8 |
| OLD | NEW |