Index: src/heap/spaces.cc |
diff --git a/src/heap/spaces.cc b/src/heap/spaces.cc |
index 5202200bf75874621776337c2e89824a9382de6c..d322916a5dc0a9cbc2957f961f407f11976d32b2 100644 |
--- a/src/heap/spaces.cc |
+++ b/src/heap/spaces.cc |
@@ -527,10 +527,10 @@ MemoryChunk* MemoryChunk::Initialize(Heap* heap, Address base, size_t size, |
chunk->flags_ = Flags(NO_FLAGS); |
chunk->set_owner(owner); |
chunk->InitializeReservedMemory(); |
- chunk->slot_set_[OLD_TO_NEW].SetValue(nullptr); |
- chunk->slot_set_[OLD_TO_OLD].SetValue(nullptr); |
- chunk->typed_slot_set_[OLD_TO_NEW].SetValue(nullptr); |
- chunk->typed_slot_set_[OLD_TO_OLD].SetValue(nullptr); |
+ chunk->old_to_new_slots_.SetValue(nullptr); |
+ chunk->old_to_old_slots_ = nullptr; |
+ chunk->typed_old_to_new_slots_.SetValue(nullptr); |
+ chunk->typed_old_to_old_slots_ = nullptr; |
chunk->skip_list_ = nullptr; |
chunk->progress_bar_ = 0; |
chunk->high_water_mark_.SetValue(static_cast<intptr_t>(area_start - base)); |
@@ -1114,15 +1114,15 @@ void MemoryChunk::ReleaseAllocatedMemory() { |
delete mutex_; |
mutex_ = nullptr; |
} |
- ReleaseSlotSet<OLD_TO_NEW>(); |
- ReleaseSlotSet<OLD_TO_OLD>(); |
- ReleaseTypedSlotSet<OLD_TO_NEW>(); |
- ReleaseTypedSlotSet<OLD_TO_OLD>(); |
+ if (old_to_new_slots_.Value() != nullptr) ReleaseOldToNewSlots(); |
+ if (old_to_old_slots_ != nullptr) ReleaseOldToOldSlots(); |
+ if (typed_old_to_new_slots_.Value() != nullptr) ReleaseTypedOldToNewSlots(); |
+ if (typed_old_to_old_slots_ != nullptr) ReleaseTypedOldToOldSlots(); |
if (local_tracker_ != nullptr) ReleaseLocalTracker(); |
if (young_generation_bitmap_ != nullptr) ReleaseYoungGenerationBitmap(); |
} |
-static SlotSet* AllocateAndInitializeSlotSet(size_t size, Address page_start) { |
+static SlotSet* AllocateSlotSet(size_t size, Address page_start) { |
size_t pages = (size + Page::kPageSize - 1) / Page::kPageSize; |
DCHECK(pages > 0); |
SlotSet* slot_set = new SlotSet[pages]; |
@@ -1132,58 +1132,46 @@ static SlotSet* AllocateAndInitializeSlotSet(size_t size, Address page_start) { |
return slot_set; |
} |
-template SlotSet* MemoryChunk::AllocateSlotSet<OLD_TO_NEW>(); |
-template SlotSet* MemoryChunk::AllocateSlotSet<OLD_TO_OLD>(); |
+void MemoryChunk::AllocateOldToNewSlots() { |
+ DCHECK(nullptr == old_to_new_slots_.Value()); |
+ old_to_new_slots_.SetValue(AllocateSlotSet(size_, address())); |
+} |
-template <RememberedSetType type> |
-SlotSet* MemoryChunk::AllocateSlotSet() { |
- SlotSet* slot_set = AllocateAndInitializeSlotSet(size_, address()); |
- if (!slot_set_[type].TrySetValue(nullptr, slot_set)) { |
- delete[] slot_set; |
- slot_set = slot_set_[type].Value(); |
- DCHECK(slot_set); |
- return slot_set; |
- } |
- return slot_set; |
+void MemoryChunk::ReleaseOldToNewSlots() { |
+ SlotSet* old_to_new_slots = old_to_new_slots_.Value(); |
+ delete[] old_to_new_slots; |
+ old_to_new_slots_.SetValue(nullptr); |
} |
-template void MemoryChunk::ReleaseSlotSet<OLD_TO_NEW>(); |
-template void MemoryChunk::ReleaseSlotSet<OLD_TO_OLD>(); |
+void MemoryChunk::AllocateOldToOldSlots() { |
+ DCHECK(nullptr == old_to_old_slots_); |
+ old_to_old_slots_ = AllocateSlotSet(size_, address()); |
+} |
-template <RememberedSetType type> |
-void MemoryChunk::ReleaseSlotSet() { |
- SlotSet* slot_set = slot_set_[type].Value(); |
- if (slot_set) { |
- delete[] slot_set; |
- slot_set_[type].SetValue(nullptr); |
- } |
+void MemoryChunk::ReleaseOldToOldSlots() { |
+ delete[] old_to_old_slots_; |
+ old_to_old_slots_ = nullptr; |
} |
-template TypedSlotSet* MemoryChunk::AllocateTypedSlotSet<OLD_TO_NEW>(); |
-template TypedSlotSet* MemoryChunk::AllocateTypedSlotSet<OLD_TO_OLD>(); |
+void MemoryChunk::AllocateTypedOldToNewSlots() { |
+ DCHECK(nullptr == typed_old_to_new_slots_.Value()); |
+ typed_old_to_new_slots_.SetValue(new TypedSlotSet(address())); |
+} |
-template <RememberedSetType type> |
-TypedSlotSet* MemoryChunk::AllocateTypedSlotSet() { |
- TypedSlotSet* slot_set = new TypedSlotSet(address()); |
- if (!typed_slot_set_[type].TrySetValue(nullptr, slot_set)) { |
- delete slot_set; |
- slot_set = typed_slot_set_[type].Value(); |
- DCHECK(slot_set); |
- return slot_set; |
- } |
- return slot_set; |
+void MemoryChunk::ReleaseTypedOldToNewSlots() { |
+ TypedSlotSet* typed_old_to_new_slots = typed_old_to_new_slots_.Value(); |
+ delete typed_old_to_new_slots; |
+ typed_old_to_new_slots_.SetValue(nullptr); |
} |
-template void MemoryChunk::ReleaseTypedSlotSet<OLD_TO_NEW>(); |
-template void MemoryChunk::ReleaseTypedSlotSet<OLD_TO_OLD>(); |
+void MemoryChunk::AllocateTypedOldToOldSlots() { |
+ DCHECK(nullptr == typed_old_to_old_slots_); |
+ typed_old_to_old_slots_ = new TypedSlotSet(address()); |
+} |
-template <RememberedSetType type> |
-void MemoryChunk::ReleaseTypedSlotSet() { |
- TypedSlotSet* typed_slot_set = typed_slot_set_[type].Value(); |
- if (typed_slot_set) { |
- delete typed_slot_set; |
- typed_slot_set_[type].SetValue(nullptr); |
- } |
+void MemoryChunk::ReleaseTypedOldToOldSlots() { |
+ delete typed_old_to_old_slots_; |
+ typed_old_to_old_slots_ = nullptr; |
} |
void MemoryChunk::AllocateLocalTracker() { |