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