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