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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/platform/platform.h" | 10 #include "src/base/platform/platform.h" |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 284 |
285 | 285 |
286 // ----------------------------------------------------------------------------- | 286 // ----------------------------------------------------------------------------- |
287 // MemoryAllocator | 287 // MemoryAllocator |
288 // | 288 // |
289 | 289 |
290 MemoryAllocator::MemoryAllocator(Isolate* isolate) | 290 MemoryAllocator::MemoryAllocator(Isolate* isolate) |
291 : isolate_(isolate), | 291 : isolate_(isolate), |
292 code_range_(nullptr), | 292 code_range_(nullptr), |
293 capacity_(0), | 293 capacity_(0), |
294 capacity_executable_(0), | |
295 size_(0), | 294 size_(0), |
296 size_executable_(0), | 295 size_executable_(0), |
297 lowest_ever_allocated_(reinterpret_cast<void*>(-1)), | 296 lowest_ever_allocated_(reinterpret_cast<void*>(-1)), |
298 highest_ever_allocated_(reinterpret_cast<void*>(0)), | 297 highest_ever_allocated_(reinterpret_cast<void*>(0)), |
299 unmapper_(this) {} | 298 unmapper_(this) {} |
300 | 299 |
301 bool MemoryAllocator::SetUp(size_t capacity, size_t capacity_executable, | 300 bool MemoryAllocator::SetUp(size_t capacity, size_t code_range_size) { |
302 size_t code_range_size) { | |
303 capacity_ = RoundUp(capacity, Page::kPageSize); | 301 capacity_ = RoundUp(capacity, Page::kPageSize); |
304 capacity_executable_ = RoundUp(capacity_executable, Page::kPageSize); | |
305 DCHECK_GE(capacity_, capacity_executable_); | |
306 | 302 |
307 size_ = 0; | 303 size_ = 0; |
308 size_executable_ = 0; | 304 size_executable_ = 0; |
309 | 305 |
310 code_range_ = new CodeRange(isolate_); | 306 code_range_ = new CodeRange(isolate_); |
311 if (!code_range_->SetUp(code_range_size)) return false; | 307 if (!code_range_->SetUp(code_range_size)) return false; |
312 | 308 |
313 return true; | 309 return true; |
314 } | 310 } |
315 | 311 |
316 | 312 |
317 void MemoryAllocator::TearDown() { | 313 void MemoryAllocator::TearDown() { |
318 unmapper()->TearDown(); | 314 unmapper()->TearDown(); |
319 | 315 |
320 // Check that spaces were torn down before MemoryAllocator. | 316 // Check that spaces were torn down before MemoryAllocator. |
321 DCHECK_EQ(size_.Value(), 0u); | 317 DCHECK_EQ(size_.Value(), 0u); |
322 // TODO(gc) this will be true again when we fix FreeMemory. | 318 // TODO(gc) this will be true again when we fix FreeMemory. |
323 // DCHECK(size_executable_ == 0); | 319 // DCHECK(size_executable_ == 0); |
324 capacity_ = 0; | 320 capacity_ = 0; |
325 capacity_executable_ = 0; | |
326 | 321 |
327 if (last_chunk_.IsReserved()) { | 322 if (last_chunk_.IsReserved()) { |
328 last_chunk_.Release(); | 323 last_chunk_.Release(); |
329 } | 324 } |
330 | 325 |
331 delete code_range_; | 326 delete code_range_; |
332 code_range_ = nullptr; | 327 code_range_ = nullptr; |
333 } | 328 } |
334 | 329 |
335 class MemoryAllocator::Unmapper::UnmapFreeMemoryTask : public v8::Task { | 330 class MemoryAllocator::Unmapper::UnmapFreeMemoryTask : public v8::Task { |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 // +----------------------------+<- aligned at OS page boundary | 686 // +----------------------------+<- aligned at OS page boundary |
692 // | Reserved but not committed | | 687 // | Reserved but not committed | |
693 // +----------------------------+<- base + chunk_size | 688 // +----------------------------+<- base + chunk_size |
694 // | 689 // |
695 | 690 |
696 if (executable == EXECUTABLE) { | 691 if (executable == EXECUTABLE) { |
697 chunk_size = RoundUp(CodePageAreaStartOffset() + reserve_area_size, | 692 chunk_size = RoundUp(CodePageAreaStartOffset() + reserve_area_size, |
698 GetCommitPageSize()) + | 693 GetCommitPageSize()) + |
699 CodePageGuardSize(); | 694 CodePageGuardSize(); |
700 | 695 |
701 // Check executable memory limit. | |
702 if ((size_executable_.Value() + chunk_size) > capacity_executable_) { | |
703 LOG(isolate_, StringEvent("MemoryAllocator::AllocateRawMemory", | |
704 "V8 Executable Allocation capacity exceeded")); | |
705 return NULL; | |
706 } | |
707 | |
708 // Size of header (not executable) plus area (executable). | 696 // Size of header (not executable) plus area (executable). |
709 size_t commit_size = RoundUp(CodePageGuardStartOffset() + commit_area_size, | 697 size_t commit_size = RoundUp(CodePageGuardStartOffset() + commit_area_size, |
710 GetCommitPageSize()); | 698 GetCommitPageSize()); |
711 // Allocate executable memory either from code range or from the | 699 // Allocate executable memory either from code range or from the |
712 // OS. | 700 // OS. |
713 #ifdef V8_TARGET_ARCH_MIPS64 | 701 #ifdef V8_TARGET_ARCH_MIPS64 |
714 // Use code range only for large object space on mips64 to keep address | 702 // Use code range only for large object space on mips64 to keep address |
715 // range within 256-MB memory region. | 703 // range within 256-MB memory region. |
716 if (code_range()->valid() && reserve_area_size > CodePageAreaSize()) { | 704 if (code_range()->valid() && reserve_area_size > CodePageAreaSize()) { |
717 #else | 705 #else |
(...skipping 2596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3314 PrintF("\n"); | 3302 PrintF("\n"); |
3315 } | 3303 } |
3316 printf(" --------------------------------------\n"); | 3304 printf(" --------------------------------------\n"); |
3317 printf(" Marked: %x, LiveCount: %" V8PRIdPTR "\n", mark_size, | 3305 printf(" Marked: %x, LiveCount: %" V8PRIdPTR "\n", mark_size, |
3318 MarkingState::Internal(this).live_bytes()); | 3306 MarkingState::Internal(this).live_bytes()); |
3319 } | 3307 } |
3320 | 3308 |
3321 #endif // DEBUG | 3309 #endif // DEBUG |
3322 } // namespace internal | 3310 } // namespace internal |
3323 } // namespace v8 | 3311 } // namespace v8 |
OLD | NEW |