11d54e73444e017d3a65234e0f193846f3e27472bIan Rogers/* 21d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Copyright (C) 2012 The Android Open Source Project 31d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * 41d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 51d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * you may not use this file except in compliance with the License. 61d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * You may obtain a copy of the License at 71d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * 81d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 91d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * 101d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * Unless required by applicable law or agreed to in writing, software 111d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 121d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * See the License for the specific language governing permissions and 141d54e73444e017d3a65234e0f193846f3e27472bIan Rogers * limitations under the License. 151d54e73444e017d3a65234e0f193846f3e27472bIan Rogers */ 161d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "heap_bitmap.h" 181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 19a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier#include "gc/accounting/space_bitmap-inl.h" 201d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/space/space.h" 211d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 221d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace art { 231d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc { 241d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace accounting { 251d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 26a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartiervoid HeapBitmap::ReplaceBitmap(ContinuousSpaceBitmap* old_bitmap, 27a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier ContinuousSpaceBitmap* new_bitmap) { 28bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier auto it = std::find(continuous_space_bitmaps_.begin(), continuous_space_bitmaps_.end(), 29bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier old_bitmap); 30bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier CHECK(it != continuous_space_bitmaps_.end()) << " continuous space bitmap " << old_bitmap 31bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier << " not found"; 32bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier *it = new_bitmap; 331d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} 341d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 35bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartiervoid HeapBitmap::ReplaceLargeObjectBitmap(LargeObjectBitmap* old_bitmap, 36bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier LargeObjectBitmap* new_bitmap) { 37bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier auto it = std::find(large_object_bitmaps_.begin(), large_object_bitmaps_.end(), old_bitmap); 38bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier CHECK(it != large_object_bitmaps_.end()) << " large object bitmap " << old_bitmap 39bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier << " not found"; 40bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier *it = new_bitmap; 411d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} 421d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 43a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartiervoid HeapBitmap::AddContinuousSpaceBitmap(accounting::ContinuousSpaceBitmap* bitmap) { 44bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier DCHECK(bitmap != nullptr); 45bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier // Check that there is no bitmap overlap. 4602e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier for (const auto& cur_bitmap : continuous_space_bitmaps_) { 47bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier CHECK(bitmap->HeapBegin() >= cur_bitmap->HeapLimit() || 48bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier bitmap->HeapLimit() <= cur_bitmap->HeapBegin()) 49bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier << "Bitmap " << bitmap->Dump() << " overlaps with existing bitmap " 50bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier << cur_bitmap->Dump(); 511d54e73444e017d3a65234e0f193846f3e27472bIan Rogers } 521d54e73444e017d3a65234e0f193846f3e27472bIan Rogers continuous_space_bitmaps_.push_back(bitmap); 531d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} 541d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 55a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartiervoid HeapBitmap::RemoveContinuousSpaceBitmap(accounting::ContinuousSpaceBitmap* bitmap) { 56bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier DCHECK(bitmap != nullptr); 57e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier auto it = std::find(continuous_space_bitmaps_.begin(), continuous_space_bitmaps_.end(), bitmap); 58e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier DCHECK(it != continuous_space_bitmaps_.end()); 59e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier continuous_space_bitmaps_.erase(it); 60e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier} 61e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier 62bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartiervoid HeapBitmap::AddLargeObjectBitmap(LargeObjectBitmap* bitmap) { 63bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier DCHECK(bitmap != nullptr); 64bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier large_object_bitmaps_.push_back(bitmap); 651d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} 661d54e73444e017d3a65234e0f193846f3e27472bIan Rogers 67bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartiervoid HeapBitmap::RemoveLargeObjectBitmap(LargeObjectBitmap* bitmap) { 68bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier DCHECK(bitmap != nullptr); 69bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier auto it = std::find(large_object_bitmaps_.begin(), large_object_bitmaps_.end(), bitmap); 70bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier DCHECK(it != large_object_bitmaps_.end()); 71bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier large_object_bitmaps_.erase(it); 72e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier} 73e6da9af8dfe0a3e3fbc2be700554f6478380e7b9Mathieu Chartier 741d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace accounting 751d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace gc 761d54e73444e017d3a65234e0f193846f3e27472bIan Rogers} // namespace art 77