/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "heap_bitmap.h" #include "gc/accounting/space_bitmap-inl.h" #include "gc/space/space.h" namespace art { namespace gc { namespace accounting { void HeapBitmap::ReplaceBitmap(ContinuousSpaceBitmap* old_bitmap, ContinuousSpaceBitmap* new_bitmap) { auto it = std::find(continuous_space_bitmaps_.begin(), continuous_space_bitmaps_.end(), old_bitmap); CHECK(it != continuous_space_bitmaps_.end()) << " continuous space bitmap " << old_bitmap << " not found"; *it = new_bitmap; } void HeapBitmap::ReplaceLargeObjectBitmap(LargeObjectBitmap* old_bitmap, LargeObjectBitmap* new_bitmap) { auto it = std::find(large_object_bitmaps_.begin(), large_object_bitmaps_.end(), old_bitmap); CHECK(it != large_object_bitmaps_.end()) << " large object bitmap " << old_bitmap << " not found"; *it = new_bitmap; } void HeapBitmap::AddContinuousSpaceBitmap(accounting::ContinuousSpaceBitmap* bitmap) { DCHECK(bitmap != nullptr); // Check that there is no bitmap overlap. for (const auto& cur_bitmap : continuous_space_bitmaps_) { CHECK(bitmap->HeapBegin() >= cur_bitmap->HeapLimit() || bitmap->HeapLimit() <= cur_bitmap->HeapBegin()) << "Bitmap " << bitmap->Dump() << " overlaps with existing bitmap " << cur_bitmap->Dump(); } continuous_space_bitmaps_.push_back(bitmap); } void HeapBitmap::RemoveContinuousSpaceBitmap(accounting::ContinuousSpaceBitmap* bitmap) { DCHECK(bitmap != nullptr); auto it = std::find(continuous_space_bitmaps_.begin(), continuous_space_bitmaps_.end(), bitmap); DCHECK(it != continuous_space_bitmaps_.end()); continuous_space_bitmaps_.erase(it); } void HeapBitmap::AddLargeObjectBitmap(LargeObjectBitmap* bitmap) { DCHECK(bitmap != nullptr); large_object_bitmaps_.push_back(bitmap); } void HeapBitmap::RemoveLargeObjectBitmap(LargeObjectBitmap* bitmap) { DCHECK(bitmap != nullptr); auto it = std::find(large_object_bitmaps_.begin(), large_object_bitmaps_.end(), bitmap); DCHECK(it != large_object_bitmaps_.end()); large_object_bitmaps_.erase(it); } void HeapBitmap::Walk(ObjectCallback* callback, void* arg) { for (const auto& bitmap : continuous_space_bitmaps_) { bitmap->Walk(callback, arg); } for (const auto& bitmap : large_object_bitmaps_) { bitmap->Walk(callback, arg); } } } // namespace accounting } // namespace gc } // namespace art