diff options
Diffstat (limited to 'runtime/gc')
-rw-r--r-- | runtime/gc/heap.cc | 2 | ||||
-rw-r--r-- | runtime/gc/heap.h | 2 | ||||
-rw-r--r-- | runtime/gc/space/malloc_space.cc | 4 |
3 files changed, 7 insertions, 1 deletions
diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc index 7e967f9862..be7344a13a 100644 --- a/runtime/gc/heap.cc +++ b/runtime/gc/heap.cc @@ -3145,6 +3145,8 @@ void Heap::GrowForUtilization(collector::GarbageCollector* collector_ran, } void Heap::ClampGrowthLimit() { + // Use heap bitmap lock to guard against races with BindLiveToMarkBitmap. + WriterMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_); capacity_ = growth_limit_; for (const auto& space : continuous_spaces_) { if (space->IsMallocSpace()) { diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h index 959ff18516..603cbfd42a 100644 --- a/runtime/gc/heap.h +++ b/runtime/gc/heap.h @@ -309,7 +309,7 @@ class Heap { // Make the current growth limit the new maximum capacity, unmaps pages at the end of spaces // which will never be used. Used to implement dalvik.system.VMRuntime.clampGrowthLimit. - void ClampGrowthLimit(); + void ClampGrowthLimit() LOCKS_EXCLUDED(Locks::heap_bitmap_lock_); // Target ideal heap utilization ratio, implements // dalvik.system.VMRuntime.getTargetHeapUtilization. diff --git a/runtime/gc/space/malloc_space.cc b/runtime/gc/space/malloc_space.cc index 67e8847acd..b09de6fa40 100644 --- a/runtime/gc/space/malloc_space.cc +++ b/runtime/gc/space/malloc_space.cc @@ -253,6 +253,10 @@ void MallocSpace::ClampGrowthLimit() { CHECK_LE(new_capacity, NonGrowthLimitCapacity()); GetLiveBitmap()->SetHeapSize(new_capacity); GetMarkBitmap()->SetHeapSize(new_capacity); + if (temp_bitmap_.get() != nullptr) { + // If the bitmaps are clamped, then the temp bitmap is actually the mark bitmap. + temp_bitmap_->SetHeapSize(new_capacity); + } GetMemMap()->SetSize(new_capacity); limit_ = Begin() + new_capacity; CHECK(temp_bitmap_.get() == nullptr); |