| 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 3014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3025 | 3025 |
| 3026 // GC support | 3026 // GC support |
| 3027 Object* LargeObjectSpace::FindObject(Address a) { | 3027 Object* LargeObjectSpace::FindObject(Address a) { |
| 3028 LargePage* page = FindPage(a); | 3028 LargePage* page = FindPage(a); |
| 3029 if (page != NULL) { | 3029 if (page != NULL) { |
| 3030 return page->GetObject(); | 3030 return page->GetObject(); |
| 3031 } | 3031 } |
| 3032 return Smi::kZero; // Signaling not found. | 3032 return Smi::kZero; // Signaling not found. |
| 3033 } | 3033 } |
| 3034 | 3034 |
| 3035 LargePage* LargeObjectSpace::FindPageThreadSafe(Address a) { |
| 3036 base::LockGuard<base::Mutex> guard(&chunk_map_mutex_); |
| 3037 return FindPage(a); |
| 3038 } |
| 3035 | 3039 |
| 3036 LargePage* LargeObjectSpace::FindPage(Address a) { | 3040 LargePage* LargeObjectSpace::FindPage(Address a) { |
| 3037 uintptr_t key = reinterpret_cast<uintptr_t>(a) / MemoryChunk::kAlignment; | 3041 uintptr_t key = reinterpret_cast<uintptr_t>(a) / MemoryChunk::kAlignment; |
| 3038 base::HashMap::Entry* e = chunk_map_.Lookup(reinterpret_cast<void*>(key), | 3042 base::HashMap::Entry* e = chunk_map_.Lookup(reinterpret_cast<void*>(key), |
| 3039 static_cast<uint32_t>(key)); | 3043 static_cast<uint32_t>(key)); |
| 3040 if (e != NULL) { | 3044 if (e != NULL) { |
| 3041 DCHECK(e->value != NULL); | 3045 DCHECK(e->value != NULL); |
| 3042 LargePage* page = reinterpret_cast<LargePage*>(e->value); | 3046 LargePage* page = reinterpret_cast<LargePage*>(e->value); |
| 3043 DCHECK(LargePage::IsValid(page)); | 3047 DCHECK(LargePage::IsValid(page)); |
| 3044 if (page->Contains(a)) { | 3048 if (page->Contains(a)) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3061 current = current->next_page(); | 3065 current = current->next_page(); |
| 3062 } | 3066 } |
| 3063 } | 3067 } |
| 3064 | 3068 |
| 3065 void LargeObjectSpace::InsertChunkMapEntries(LargePage* page) { | 3069 void LargeObjectSpace::InsertChunkMapEntries(LargePage* page) { |
| 3066 // Register all MemoryChunk::kAlignment-aligned chunks covered by | 3070 // Register all MemoryChunk::kAlignment-aligned chunks covered by |
| 3067 // this large page in the chunk map. | 3071 // this large page in the chunk map. |
| 3068 uintptr_t start = reinterpret_cast<uintptr_t>(page) / MemoryChunk::kAlignment; | 3072 uintptr_t start = reinterpret_cast<uintptr_t>(page) / MemoryChunk::kAlignment; |
| 3069 uintptr_t limit = (reinterpret_cast<uintptr_t>(page) + (page->size() - 1)) / | 3073 uintptr_t limit = (reinterpret_cast<uintptr_t>(page) + (page->size() - 1)) / |
| 3070 MemoryChunk::kAlignment; | 3074 MemoryChunk::kAlignment; |
| 3075 // There may be concurrent access on the chunk map. We have to take the lock |
| 3076 // here. |
| 3077 base::LockGuard<base::Mutex> guard(&chunk_map_mutex_); |
| 3071 for (uintptr_t key = start; key <= limit; key++) { | 3078 for (uintptr_t key = start; key <= limit; key++) { |
| 3072 base::HashMap::Entry* entry = chunk_map_.InsertNew( | 3079 base::HashMap::Entry* entry = chunk_map_.InsertNew( |
| 3073 reinterpret_cast<void*>(key), static_cast<uint32_t>(key)); | 3080 reinterpret_cast<void*>(key), static_cast<uint32_t>(key)); |
| 3074 DCHECK(entry != NULL); | 3081 DCHECK(entry != NULL); |
| 3075 entry->value = page; | 3082 entry->value = page; |
| 3076 } | 3083 } |
| 3077 } | 3084 } |
| 3078 | 3085 |
| 3079 void LargeObjectSpace::RemoveChunkMapEntries(LargePage* page) { | 3086 void LargeObjectSpace::RemoveChunkMapEntries(LargePage* page) { |
| 3080 RemoveChunkMapEntries(page, page->address()); | 3087 RemoveChunkMapEntries(page, page->address()); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3240 object->ShortPrint(); | 3247 object->ShortPrint(); |
| 3241 PrintF("\n"); | 3248 PrintF("\n"); |
| 3242 } | 3249 } |
| 3243 printf(" --------------------------------------\n"); | 3250 printf(" --------------------------------------\n"); |
| 3244 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); | 3251 printf(" Marked: %x, LiveCount: %x\n", mark_size, LiveBytes()); |
| 3245 } | 3252 } |
| 3246 | 3253 |
| 3247 #endif // DEBUG | 3254 #endif // DEBUG |
| 3248 } // namespace internal | 3255 } // namespace internal |
| 3249 } // namespace v8 | 3256 } // namespace v8 |
| OLD | NEW |