12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers * Copyright (C) 2012 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
161f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_GC_ACCOUNTING_HEAP_BITMAP_INL_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_GC_ACCOUNTING_HEAP_BITMAP_INL_H_
191f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "heap_bitmap.h"
211f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
224aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier#include "space_bitmap-inl.h"
234aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier
241f87008b165d26541d832ff805250afdc89c253dBrian Carlstromnamespace art {
251d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace gc {
261d54e73444e017d3a65234e0f193846f3e27472bIan Rogersnamespace accounting {
271f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
282dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogerstemplate <typename Visitor>
29351c44765279142d15333e2ae02b8a423d195b1bAndreas Gampeinline void HeapBitmap::Visit(Visitor&& visitor) {
3002e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier  for (const auto& bitmap : continuous_space_bitmaps_) {
31184e322fe8ddd75c844a1eb2eb1ca32bc02f2d45Mathieu Chartier    bitmap->VisitMarkedRange(bitmap->HeapBegin(), bitmap->HeapLimit(), visitor);
322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  }
33bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  for (const auto& bitmap : large_object_bitmaps_) {
34bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    bitmap->VisitMarkedRange(bitmap->HeapBegin(), bitmap->HeapLimit(), visitor);
351d54e73444e017d3a65234e0f193846f3e27472bIan Rogers  }
362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers}
371f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
384aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartierinline bool HeapBitmap::Test(const mirror::Object* obj) {
39a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier  ContinuousSpaceBitmap* bitmap = GetContinuousSpaceBitmap(obj);
404aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  if (LIKELY(bitmap != nullptr)) {
414aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier    return bitmap->Test(obj);
424aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  }
43277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe  for (const auto& lo_bitmap : large_object_bitmaps_) {
44277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe    if (LIKELY(lo_bitmap->HasAddress(obj))) {
45277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe      return lo_bitmap->Test(obj);
46bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    }
47bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  }
48bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  LOG(FATAL) << "Invalid object " << obj;
49bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  return false;
504aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier}
514aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier
524aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartierinline void HeapBitmap::Clear(const mirror::Object* obj) {
53a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier  ContinuousSpaceBitmap* bitmap = GetContinuousSpaceBitmap(obj);
544aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  if (LIKELY(bitmap != nullptr)) {
554aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier    bitmap->Clear(obj);
56bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    return;
57bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  }
58277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe  for (const auto& lo_bitmap : large_object_bitmaps_) {
59277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe    if (LIKELY(lo_bitmap->HasAddress(obj))) {
60277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe      lo_bitmap->Clear(obj);
61bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    }
624aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  }
63bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  LOG(FATAL) << "Invalid object " << obj;
644aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier}
654aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier
66bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartiertemplate<typename LargeObjectSetVisitor>
67bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartierinline bool HeapBitmap::Set(const mirror::Object* obj, const LargeObjectSetVisitor& visitor) {
68a8e8f9c0a8e259a807d7b99a148d14104c24209dMathieu Chartier  ContinuousSpaceBitmap* bitmap = GetContinuousSpaceBitmap(obj);
69bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  if (LIKELY(bitmap != nullptr)) {
70bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    return bitmap->Set(obj);
71bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  }
72bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  visitor(obj);
73277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe  for (const auto& lo_bitmap : large_object_bitmaps_) {
74277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe    if (LIKELY(lo_bitmap->HasAddress(obj))) {
75277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe      return lo_bitmap->Set(obj);
76bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    }
774aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  }
78bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  LOG(FATAL) << "Invalid object " << obj;
79bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  return false;
804aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier}
814aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier
82bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartiertemplate<typename LargeObjectSetVisitor>
83bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartierinline bool HeapBitmap::AtomicTestAndSet(const mirror::Object* obj,
84bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier                                         const LargeObjectSetVisitor& visitor) {
85bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  ContinuousSpaceBitmap* bitmap = GetContinuousSpaceBitmap(obj);
86bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  if (LIKELY(bitmap != nullptr)) {
87bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    return bitmap->AtomicTestAndSet(obj);
88bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  }
89bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  visitor(obj);
90277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe  for (const auto& lo_bitmap : large_object_bitmaps_) {
91277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe    if (LIKELY(lo_bitmap->HasAddress(obj))) {
92277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe      return lo_bitmap->AtomicTestAndSet(obj);
934aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier    }
944aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  }
95bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  LOG(FATAL) << "Invalid object " << obj;
96bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  return false;
974aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier}
984aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier
99bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartierinline ContinuousSpaceBitmap* HeapBitmap::GetContinuousSpaceBitmap(const mirror::Object* obj) const {
100bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier  for (const auto& bitmap : continuous_space_bitmaps_) {
101bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier    if (bitmap->HasAddress(obj)) {
102bbd695c71e0bf518f582e84524e1cdeb3de3896cMathieu Chartier      return bitmap;
1034aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier    }
1044aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  }
1054aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier  return nullptr;
1064aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier}
1074aeec176eaf11fe03f342aadcbb79142230270edMathieu Chartier
1082cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchiinline LargeObjectBitmap* HeapBitmap::GetLargeObjectBitmap(const mirror::Object* obj) const {
1092cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi  for (const auto& bitmap : large_object_bitmaps_) {
1102cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi    if (LIKELY(bitmap->HasAddress(obj))) {
1112cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi      return bitmap;
1122cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi    }
1132cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi  }
1142cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi  return nullptr;
1152cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi}
1162cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi
1171d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace accounting
1181d54e73444e017d3a65234e0f193846f3e27472bIan Rogers}  // namespace gc
1191f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom}  // namespace art
1201f87008b165d26541d832ff805250afdc89c253dBrian Carlstrom
121fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_GC_ACCOUNTING_HEAP_BITMAP_INL_H_
122