| 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 2911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2922 | 2922 |
| 2923 HeapObject* object = current_->GetObject(); | 2923 HeapObject* object = current_->GetObject(); |
| 2924 current_ = current_->next_page(); | 2924 current_ = current_->next_page(); |
| 2925 return object; | 2925 return object; |
| 2926 } | 2926 } |
| 2927 | 2927 |
| 2928 | 2928 |
| 2929 // ----------------------------------------------------------------------------- | 2929 // ----------------------------------------------------------------------------- |
| 2930 // LargeObjectSpace | 2930 // LargeObjectSpace |
| 2931 | 2931 |
| 2932 | |
| 2933 LargeObjectSpace::LargeObjectSpace(Heap* heap, AllocationSpace id) | 2932 LargeObjectSpace::LargeObjectSpace(Heap* heap, AllocationSpace id) |
| 2934 : Space(heap, id, NOT_EXECUTABLE), // Managed on a per-allocation basis | 2933 : Space(heap, id, NOT_EXECUTABLE), // Managed on a per-allocation basis |
| 2935 first_page_(NULL), | 2934 first_page_(NULL), |
| 2936 size_(0), | 2935 size_(0), |
| 2937 page_count_(0), | 2936 page_count_(0), |
| 2938 objects_size_(0), | 2937 objects_size_(0), |
| 2939 chunk_map_(HashMap::PointersMatch, 1024) {} | 2938 chunk_map_(base::HashMap::PointersMatch, 1024) {} |
| 2940 | |
| 2941 | 2939 |
| 2942 LargeObjectSpace::~LargeObjectSpace() {} | 2940 LargeObjectSpace::~LargeObjectSpace() {} |
| 2943 | 2941 |
| 2944 | 2942 |
| 2945 bool LargeObjectSpace::SetUp() { | 2943 bool LargeObjectSpace::SetUp() { |
| 2946 first_page_ = NULL; | 2944 first_page_ = NULL; |
| 2947 size_ = 0; | 2945 size_ = 0; |
| 2948 page_count_ = 0; | 2946 page_count_ = 0; |
| 2949 objects_size_ = 0; | 2947 objects_size_ = 0; |
| 2950 chunk_map_.Clear(); | 2948 chunk_map_.Clear(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2981 objects_size_ += object_size; | 2979 objects_size_ += object_size; |
| 2982 page_count_++; | 2980 page_count_++; |
| 2983 page->set_next_page(first_page_); | 2981 page->set_next_page(first_page_); |
| 2984 first_page_ = page; | 2982 first_page_ = page; |
| 2985 | 2983 |
| 2986 // Register all MemoryChunk::kAlignment-aligned chunks covered by | 2984 // Register all MemoryChunk::kAlignment-aligned chunks covered by |
| 2987 // this large page in the chunk map. | 2985 // this large page in the chunk map. |
| 2988 uintptr_t base = reinterpret_cast<uintptr_t>(page) / MemoryChunk::kAlignment; | 2986 uintptr_t base = reinterpret_cast<uintptr_t>(page) / MemoryChunk::kAlignment; |
| 2989 uintptr_t limit = base + (page->size() - 1) / MemoryChunk::kAlignment; | 2987 uintptr_t limit = base + (page->size() - 1) / MemoryChunk::kAlignment; |
| 2990 for (uintptr_t key = base; key <= limit; key++) { | 2988 for (uintptr_t key = base; key <= limit; key++) { |
| 2991 HashMap::Entry* entry = chunk_map_.LookupOrInsert( | 2989 base::HashMap::Entry* entry = chunk_map_.LookupOrInsert( |
| 2992 reinterpret_cast<void*>(key), static_cast<uint32_t>(key)); | 2990 reinterpret_cast<void*>(key), static_cast<uint32_t>(key)); |
| 2993 DCHECK(entry != NULL); | 2991 DCHECK(entry != NULL); |
| 2994 entry->value = page; | 2992 entry->value = page; |
| 2995 } | 2993 } |
| 2996 | 2994 |
| 2997 HeapObject* object = page->GetObject(); | 2995 HeapObject* object = page->GetObject(); |
| 2998 MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), object_size); | 2996 MSAN_ALLOCATED_UNINITIALIZED_MEMORY(object->address(), object_size); |
| 2999 | 2997 |
| 3000 if (Heap::ShouldZapGarbage()) { | 2998 if (Heap::ShouldZapGarbage()) { |
| 3001 // Make the object consistent so the heap can be verified in OldSpaceStep. | 2999 // Make the object consistent so the heap can be verified in OldSpaceStep. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 3024 LargePage* page = FindPage(a); | 3022 LargePage* page = FindPage(a); |
| 3025 if (page != NULL) { | 3023 if (page != NULL) { |
| 3026 return page->GetObject(); | 3024 return page->GetObject(); |
| 3027 } | 3025 } |
| 3028 return Smi::FromInt(0); // Signaling not found. | 3026 return Smi::FromInt(0); // Signaling not found. |
| 3029 } | 3027 } |
| 3030 | 3028 |
| 3031 | 3029 |
| 3032 LargePage* LargeObjectSpace::FindPage(Address a) { | 3030 LargePage* LargeObjectSpace::FindPage(Address a) { |
| 3033 uintptr_t key = reinterpret_cast<uintptr_t>(a) / MemoryChunk::kAlignment; | 3031 uintptr_t key = reinterpret_cast<uintptr_t>(a) / MemoryChunk::kAlignment; |
| 3034 HashMap::Entry* e = chunk_map_.Lookup(reinterpret_cast<void*>(key), | 3032 base::HashMap::Entry* e = chunk_map_.Lookup(reinterpret_cast<void*>(key), |
| 3035 static_cast<uint32_t>(key)); | 3033 static_cast<uint32_t>(key)); |
| 3036 if (e != NULL) { | 3034 if (e != NULL) { |
| 3037 DCHECK(e->value != NULL); | 3035 DCHECK(e->value != NULL); |
| 3038 LargePage* page = reinterpret_cast<LargePage*>(e->value); | 3036 LargePage* page = reinterpret_cast<LargePage*>(e->value); |
| 3039 DCHECK(LargePage::IsValid(page)); | 3037 DCHECK(LargePage::IsValid(page)); |
| 3040 if (page->Contains(a)) { | 3038 if (page->Contains(a)) { |
| 3041 return page; | 3039 return page; |
| 3042 } | 3040 } |
| 3043 } | 3041 } |
| 3044 return NULL; | 3042 return NULL; |
| 3045 } | 3043 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3222 object->ShortPrint(); | 3220 object->ShortPrint(); |
| 3223 PrintF("\n"); | 3221 PrintF("\n"); |
| 3224 } | 3222 } |
| 3225 printf(" --------------------------------------\n"); | 3223 printf(" --------------------------------------\n"); |
| 3226 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3224 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
| 3227 } | 3225 } |
| 3228 | 3226 |
| 3229 #endif // DEBUG | 3227 #endif // DEBUG |
| 3230 } // namespace internal | 3228 } // namespace internal |
| 3231 } // namespace v8 | 3229 } // namespace v8 |
| OLD | NEW |