OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 | 144 |
145 } } // namespace v8::internal | 145 } } // namespace v8::internal |
146 | 146 |
147 | 147 |
148 static void VerifyMemoryChunk(Isolate* isolate, | 148 static void VerifyMemoryChunk(Isolate* isolate, |
149 Heap* heap, | 149 Heap* heap, |
150 CodeRange* code_range, | 150 CodeRange* code_range, |
151 size_t reserve_area_size, | 151 size_t reserve_area_size, |
152 size_t commit_area_size, | 152 size_t commit_area_size, |
153 size_t second_commit_area_size, | 153 size_t second_commit_area_size, |
154 Executability executable) { | 154 VirtualMemory::Executability executability) { |
155 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); | 155 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); |
156 CHECK(memory_allocator->SetUp(heap->MaxReserved(), | 156 CHECK(memory_allocator->SetUp(heap->MaxReserved(), |
157 heap->MaxExecutableSize())); | 157 heap->MaxExecutableSize())); |
158 TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator); | 158 TestMemoryAllocatorScope test_allocator_scope(isolate, memory_allocator); |
159 TestCodeRangeScope test_code_range_scope(isolate, code_range); | 159 TestCodeRangeScope test_code_range_scope(isolate, code_range); |
160 | 160 |
161 size_t header_size = (executable == EXECUTABLE) | 161 size_t header_size = (executability == VirtualMemory::EXECUTABLE) |
162 ? MemoryAllocator::CodePageGuardStartOffset() | 162 ? MemoryAllocator::CodePageGuardStartOffset() |
163 : MemoryChunk::kObjectStartOffset; | 163 : MemoryChunk::kObjectStartOffset; |
164 size_t guard_size = (executable == EXECUTABLE) | 164 size_t guard_size = (executability == VirtualMemory::EXECUTABLE) |
165 ? MemoryAllocator::CodePageGuardSize() | 165 ? MemoryAllocator::CodePageGuardSize() |
166 : 0; | 166 : 0; |
167 | 167 |
168 MemoryChunk* memory_chunk = memory_allocator->AllocateChunk(reserve_area_size, | 168 MemoryChunk* memory_chunk = memory_allocator->AllocateChunk(reserve_area_size, |
169 commit_area_size, | 169 commit_area_size, |
170 executable, | 170 executability, |
171 NULL); | 171 NULL); |
172 size_t alignment = code_range->exists() ? | 172 size_t alignment = code_range->exists() ? |
173 MemoryChunk::kAlignment : OS::CommitPageSize(); | 173 MemoryChunk::kAlignment : VirtualMemory::GetPageSize(); |
174 size_t reserved_size = ((executable == EXECUTABLE)) | 174 size_t reserved_size = ((executability == VirtualMemory::EXECUTABLE)) |
175 ? RoundUp(header_size + guard_size + reserve_area_size + guard_size, | 175 ? RoundUp(header_size + guard_size + reserve_area_size + guard_size, |
176 alignment) | 176 alignment) |
177 : RoundUp(header_size + reserve_area_size, OS::CommitPageSize()); | 177 : RoundUp(header_size + reserve_area_size, VirtualMemory::GetPageSize()); |
178 CHECK(memory_chunk->size() == reserved_size); | 178 CHECK(memory_chunk->size() == reserved_size); |
179 CHECK(memory_chunk->area_start() < memory_chunk->address() + | 179 CHECK(memory_chunk->area_start() < memory_chunk->address() + |
180 memory_chunk->size()); | 180 memory_chunk->size()); |
181 CHECK(memory_chunk->area_end() <= memory_chunk->address() + | 181 CHECK(memory_chunk->area_end() <= memory_chunk->address() + |
182 memory_chunk->size()); | 182 memory_chunk->size()); |
183 CHECK(static_cast<size_t>(memory_chunk->area_size()) == commit_area_size); | 183 CHECK(static_cast<size_t>(memory_chunk->area_size()) == commit_area_size); |
184 | 184 |
185 Address area_start = memory_chunk->area_start(); | 185 Address area_start = memory_chunk->area_start(); |
186 | 186 |
187 memory_chunk->CommitArea(second_commit_area_size); | 187 memory_chunk->CommitArea(second_commit_area_size); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 CodeRange* code_range = new CodeRange(isolate); | 223 CodeRange* code_range = new CodeRange(isolate); |
224 const int code_range_size = 32 * MB; | 224 const int code_range_size = 32 * MB; |
225 if (!code_range->SetUp(code_range_size)) return; | 225 if (!code_range->SetUp(code_range_size)) return; |
226 | 226 |
227 VerifyMemoryChunk(isolate, | 227 VerifyMemoryChunk(isolate, |
228 heap, | 228 heap, |
229 code_range, | 229 code_range, |
230 reserve_area_size, | 230 reserve_area_size, |
231 initial_commit_area_size, | 231 initial_commit_area_size, |
232 second_commit_area_size, | 232 second_commit_area_size, |
233 EXECUTABLE); | 233 VirtualMemory::EXECUTABLE); |
234 | 234 |
235 VerifyMemoryChunk(isolate, | 235 VerifyMemoryChunk(isolate, |
236 heap, | 236 heap, |
237 code_range, | 237 code_range, |
238 reserve_area_size, | 238 reserve_area_size, |
239 initial_commit_area_size, | 239 initial_commit_area_size, |
240 second_commit_area_size, | 240 second_commit_area_size, |
241 NOT_EXECUTABLE); | 241 VirtualMemory::NOT_EXECUTABLE); |
242 delete code_range; | 242 delete code_range; |
243 | 243 |
244 // Without CodeRange. | 244 // Without CodeRange. |
245 code_range = NULL; | 245 code_range = NULL; |
246 VerifyMemoryChunk(isolate, | 246 VerifyMemoryChunk(isolate, |
247 heap, | 247 heap, |
248 code_range, | 248 code_range, |
249 reserve_area_size, | 249 reserve_area_size, |
250 initial_commit_area_size, | 250 initial_commit_area_size, |
251 second_commit_area_size, | 251 second_commit_area_size, |
252 EXECUTABLE); | 252 VirtualMemory::EXECUTABLE); |
253 | 253 |
254 VerifyMemoryChunk(isolate, | 254 VerifyMemoryChunk(isolate, |
255 heap, | 255 heap, |
256 code_range, | 256 code_range, |
257 reserve_area_size, | 257 reserve_area_size, |
258 initial_commit_area_size, | 258 initial_commit_area_size, |
259 second_commit_area_size, | 259 second_commit_area_size, |
260 NOT_EXECUTABLE); | 260 VirtualMemory::NOT_EXECUTABLE); |
261 } | 261 } |
262 } | 262 } |
263 | 263 |
264 | 264 |
265 TEST(MemoryAllocator) { | 265 TEST(MemoryAllocator) { |
266 Isolate* isolate = Isolate::Current(); | 266 Isolate* isolate = Isolate::Current(); |
267 isolate->InitializeLoggingAndCounters(); | 267 isolate->InitializeLoggingAndCounters(); |
268 Heap* heap = isolate->heap(); | 268 Heap* heap = isolate->heap(); |
269 CHECK(isolate->heap()->ConfigureHeapDefault()); | 269 CHECK(isolate->heap()->ConfigureHeapDefault()); |
270 | 270 |
271 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); | 271 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); |
272 CHECK(memory_allocator->SetUp(heap->MaxReserved(), | 272 CHECK(memory_allocator->SetUp(heap->MaxReserved(), |
273 heap->MaxExecutableSize())); | 273 heap->MaxExecutableSize())); |
274 | 274 |
275 int total_pages = 0; | 275 int total_pages = 0; |
276 OldSpace faked_space(heap, | 276 OldSpace faked_space(heap, |
277 heap->MaxReserved(), | 277 heap->MaxReserved(), |
278 OLD_POINTER_SPACE, | 278 OLD_POINTER_SPACE, |
279 NOT_EXECUTABLE); | 279 VirtualMemory::NOT_EXECUTABLE); |
280 Page* first_page = memory_allocator->AllocatePage( | 280 Page* first_page = memory_allocator->AllocatePage( |
281 faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE); | 281 faked_space.AreaSize(), &faked_space, VirtualMemory::NOT_EXECUTABLE); |
282 | 282 |
283 first_page->InsertAfter(faked_space.anchor()->prev_page()); | 283 first_page->InsertAfter(faked_space.anchor()->prev_page()); |
284 CHECK(first_page->is_valid()); | 284 CHECK(first_page->is_valid()); |
285 CHECK(first_page->next_page() == faked_space.anchor()); | 285 CHECK(first_page->next_page() == faked_space.anchor()); |
286 total_pages++; | 286 total_pages++; |
287 | 287 |
288 for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) { | 288 for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) { |
289 CHECK(p->owner() == &faked_space); | 289 CHECK(p->owner() == &faked_space); |
290 } | 290 } |
291 | 291 |
292 // Again, we should get n or n - 1 pages. | 292 // Again, we should get n or n - 1 pages. |
293 Page* other = memory_allocator->AllocatePage( | 293 Page* other = memory_allocator->AllocatePage( |
294 faked_space.AreaSize(), &faked_space, NOT_EXECUTABLE); | 294 faked_space.AreaSize(), &faked_space, VirtualMemory::NOT_EXECUTABLE); |
295 CHECK(other->is_valid()); | 295 CHECK(other->is_valid()); |
296 total_pages++; | 296 total_pages++; |
297 other->InsertAfter(first_page); | 297 other->InsertAfter(first_page); |
298 int page_count = 0; | 298 int page_count = 0; |
299 for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) { | 299 for (Page* p = first_page; p != faked_space.anchor(); p = p->next_page()) { |
300 CHECK(p->owner() == &faked_space); | 300 CHECK(p->owner() == &faked_space); |
301 page_count++; | 301 page_count++; |
302 } | 302 } |
303 CHECK(total_pages == page_count); | 303 CHECK(total_pages == page_count); |
304 | 304 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 Heap* heap = isolate->heap(); | 346 Heap* heap = isolate->heap(); |
347 CHECK(heap->ConfigureHeapDefault()); | 347 CHECK(heap->ConfigureHeapDefault()); |
348 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); | 348 MemoryAllocator* memory_allocator = new MemoryAllocator(isolate); |
349 CHECK(memory_allocator->SetUp(heap->MaxReserved(), | 349 CHECK(memory_allocator->SetUp(heap->MaxReserved(), |
350 heap->MaxExecutableSize())); | 350 heap->MaxExecutableSize())); |
351 TestMemoryAllocatorScope test_scope(isolate, memory_allocator); | 351 TestMemoryAllocatorScope test_scope(isolate, memory_allocator); |
352 | 352 |
353 OldSpace* s = new OldSpace(heap, | 353 OldSpace* s = new OldSpace(heap, |
354 heap->MaxOldGenerationSize(), | 354 heap->MaxOldGenerationSize(), |
355 OLD_POINTER_SPACE, | 355 OLD_POINTER_SPACE, |
356 NOT_EXECUTABLE); | 356 VirtualMemory::NOT_EXECUTABLE); |
357 CHECK(s != NULL); | 357 CHECK(s != NULL); |
358 | 358 |
359 CHECK(s->SetUp()); | 359 CHECK(s->SetUp()); |
360 | 360 |
361 while (s->Available() > 0) { | 361 while (s->Available() > 0) { |
362 s->AllocateRaw(Page::kMaxNonCodeHeapObjectSize)->ToObjectUnchecked(); | 362 s->AllocateRaw(Page::kMaxNonCodeHeapObjectSize)->ToObjectUnchecked(); |
363 } | 363 } |
364 | 364 |
365 s->TearDown(); | 365 s->TearDown(); |
366 delete s; | 366 delete s; |
367 memory_allocator->TearDown(); | 367 memory_allocator->TearDown(); |
368 delete memory_allocator; | 368 delete memory_allocator; |
369 } | 369 } |
370 | 370 |
371 | 371 |
372 TEST(LargeObjectSpace) { | 372 TEST(LargeObjectSpace) { |
373 v8::V8::Initialize(); | 373 v8::V8::Initialize(); |
374 | 374 |
375 LargeObjectSpace* lo = HEAP->lo_space(); | 375 LargeObjectSpace* lo = HEAP->lo_space(); |
376 CHECK(lo != NULL); | 376 CHECK(lo != NULL); |
377 | 377 |
378 int lo_size = Page::kPageSize; | 378 int lo_size = Page::kPageSize; |
379 | 379 |
380 Object* obj = lo->AllocateRaw(lo_size, NOT_EXECUTABLE)->ToObjectUnchecked(); | 380 Object* obj = lo->AllocateRaw( |
| 381 lo_size, VirtualMemory::NOT_EXECUTABLE)->ToObjectUnchecked(); |
381 CHECK(obj->IsHeapObject()); | 382 CHECK(obj->IsHeapObject()); |
382 | 383 |
383 HeapObject* ho = HeapObject::cast(obj); | 384 HeapObject* ho = HeapObject::cast(obj); |
384 | 385 |
385 CHECK(lo->Contains(HeapObject::cast(obj))); | 386 CHECK(lo->Contains(HeapObject::cast(obj))); |
386 | 387 |
387 CHECK(lo->FindObject(ho->address()) == obj); | 388 CHECK(lo->FindObject(ho->address()) == obj); |
388 | 389 |
389 CHECK(lo->Contains(ho)); | 390 CHECK(lo->Contains(ho)); |
390 | 391 |
391 while (true) { | 392 while (true) { |
392 intptr_t available = lo->Available(); | 393 intptr_t available = lo->Available(); |
393 { MaybeObject* maybe_obj = lo->AllocateRaw(lo_size, NOT_EXECUTABLE); | 394 { MaybeObject* maybe_obj = lo->AllocateRaw( |
| 395 lo_size, VirtualMemory::NOT_EXECUTABLE); |
394 if (!maybe_obj->ToObject(&obj)) break; | 396 if (!maybe_obj->ToObject(&obj)) break; |
395 } | 397 } |
396 CHECK(lo->Available() < available); | 398 CHECK(lo->Available() < available); |
397 }; | 399 }; |
398 | 400 |
399 CHECK(!lo->IsEmpty()); | 401 CHECK(!lo->IsEmpty()); |
400 | 402 |
401 CHECK(lo->AllocateRaw(lo_size, NOT_EXECUTABLE)->IsFailure()); | 403 CHECK(lo->AllocateRaw(lo_size, VirtualMemory::NOT_EXECUTABLE)->IsFailure()); |
402 } | 404 } |
OLD | NEW |