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/slot-set.h" | 10 #include "src/heap/slot-set.h" |
(...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 | 1149 |
1150 Page* p = heap()->isolate()->memory_allocator()->AllocatePage(size, this, | 1150 Page* p = heap()->isolate()->memory_allocator()->AllocatePage(size, this, |
1151 executable()); | 1151 executable()); |
1152 if (p == NULL) return false; | 1152 if (p == NULL) return false; |
1153 | 1153 |
1154 AccountCommitted(static_cast<intptr_t>(p->size())); | 1154 AccountCommitted(static_cast<intptr_t>(p->size())); |
1155 | 1155 |
1156 // Pages created during bootstrapping may contain immortal immovable objects. | 1156 // Pages created during bootstrapping may contain immortal immovable objects. |
1157 if (!heap()->deserialization_complete()) p->MarkNeverEvacuate(); | 1157 if (!heap()->deserialization_complete()) p->MarkNeverEvacuate(); |
1158 | 1158 |
| 1159 // When incremental marking was activated, old generation pages are allocated |
| 1160 // black. |
| 1161 if (heap()->incremental_marking()->black_allocation()) { |
| 1162 Bitmap::SetAllBits(p); |
| 1163 p->SetFlag(Page::BLACK_PAGE); |
| 1164 if (FLAG_trace_incremental_marking) { |
| 1165 PrintIsolate(heap()->isolate(), "Added black page %p\n", p); |
| 1166 } |
| 1167 } |
| 1168 |
1159 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); | 1169 DCHECK(Capacity() <= heap()->MaxOldGenerationSize()); |
1160 | 1170 |
1161 p->InsertAfter(anchor_.prev_page()); | 1171 p->InsertAfter(anchor_.prev_page()); |
1162 | 1172 |
1163 return true; | 1173 return true; |
1164 } | 1174 } |
1165 | 1175 |
1166 | 1176 |
1167 int PagedSpace::CountTotalPages() { | 1177 int PagedSpace::CountTotalPages() { |
1168 PageIterator it(this); | 1178 PageIterator it(this); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1250 | 1260 |
1251 // Perform space-specific object verification. | 1261 // Perform space-specific object verification. |
1252 VerifyObject(object); | 1262 VerifyObject(object); |
1253 | 1263 |
1254 // The object itself should look OK. | 1264 // The object itself should look OK. |
1255 object->ObjectVerify(); | 1265 object->ObjectVerify(); |
1256 | 1266 |
1257 // All the interior pointers should be contained in the heap. | 1267 // All the interior pointers should be contained in the heap. |
1258 int size = object->Size(); | 1268 int size = object->Size(); |
1259 object->IterateBody(map->instance_type(), size, visitor); | 1269 object->IterateBody(map->instance_type(), size, visitor); |
1260 if (Marking::IsBlack(Marking::MarkBitFrom(object))) { | 1270 if (!page->IsFlagSet(Page::BLACK_PAGE) && |
| 1271 Marking::IsBlack(Marking::MarkBitFrom(object))) { |
1261 black_size += size; | 1272 black_size += size; |
1262 } | 1273 } |
1263 | 1274 |
1264 CHECK(object->address() + size <= top); | 1275 CHECK(object->address() + size <= top); |
1265 end_of_previous_object = object->address() + size; | 1276 end_of_previous_object = object->address() + size; |
1266 } | 1277 } |
1267 CHECK_LE(black_size, page->LiveBytes()); | 1278 CHECK_LE(black_size, page->LiveBytes()); |
1268 } | 1279 } |
1269 CHECK(allocation_pointer_found_in_space); | 1280 CHECK(allocation_pointer_found_in_space); |
1270 } | 1281 } |
(...skipping 1721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2992 uintptr_t base = reinterpret_cast<uintptr_t>(page) / MemoryChunk::kAlignment; | 3003 uintptr_t base = reinterpret_cast<uintptr_t>(page) / MemoryChunk::kAlignment; |
2993 uintptr_t limit = base + (page->size() - 1) / MemoryChunk::kAlignment; | 3004 uintptr_t limit = base + (page->size() - 1) / MemoryChunk::kAlignment; |
2994 for (uintptr_t key = base; key <= limit; key++) { | 3005 for (uintptr_t key = base; key <= limit; key++) { |
2995 HashMap::Entry* entry = chunk_map_.LookupOrInsert( | 3006 HashMap::Entry* entry = chunk_map_.LookupOrInsert( |
2996 reinterpret_cast<void*>(key), static_cast<uint32_t>(key)); | 3007 reinterpret_cast<void*>(key), static_cast<uint32_t>(key)); |
2997 DCHECK(entry != NULL); | 3008 DCHECK(entry != NULL); |
2998 entry->value = page; | 3009 entry->value = page; |
2999 } | 3010 } |
3000 | 3011 |
3001 HeapObject* object = page->GetObject(); | 3012 HeapObject* object = page->GetObject(); |
3002 | 3013 if (heap()->incremental_marking()->black_allocation()) { |
| 3014 MarkBit mark_bit = Marking::MarkBitFrom(object); |
| 3015 Marking::MarkBlack(mark_bit); |
| 3016 page->SetFlag(Page::BLACK_PAGE); |
| 3017 } |
3003 MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), object_size); | 3018 MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), object_size); |
3004 | 3019 |
3005 if (Heap::ShouldZapGarbage()) { | 3020 if (Heap::ShouldZapGarbage()) { |
3006 // Make the object consistent so the heap can be verified in OldSpaceStep. | 3021 // Make the object consistent so the heap can be verified in OldSpaceStep. |
3007 // We only need to do this in debug builds or if verify_heap is on. | 3022 // We only need to do this in debug builds or if verify_heap is on. |
3008 reinterpret_cast<Object**>(object->address())[0] = | 3023 reinterpret_cast<Object**>(object->address())[0] = |
3009 heap()->fixed_array_map(); | 3024 heap()->fixed_array_map(); |
3010 reinterpret_cast<Object**>(object->address())[1] = Smi::FromInt(0); | 3025 reinterpret_cast<Object**>(object->address())[1] = Smi::FromInt(0); |
3011 } | 3026 } |
3012 | 3027 |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3230 object->ShortPrint(); | 3245 object->ShortPrint(); |
3231 PrintF("\n"); | 3246 PrintF("\n"); |
3232 } | 3247 } |
3233 printf(" --------------------------------------\n"); | 3248 printf(" --------------------------------------\n"); |
3234 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3249 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
3235 } | 3250 } |
3236 | 3251 |
3237 #endif // DEBUG | 3252 #endif // DEBUG |
3238 } // namespace internal | 3253 } // namespace internal |
3239 } // namespace v8 | 3254 } // namespace v8 |
OLD | NEW |