18d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier/* 28d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * Copyright (C) 2014 The Android Open Source Project 38d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * 48d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 58d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * you may not use this file except in compliance with the License. 68d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * You may obtain a copy of the License at 78d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * 88d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 98d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * 108d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 118d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 128d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * See the License for the specific language governing permissions and 148d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier * limitations under the License. 158d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier */ 168d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 178d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier#ifndef ART_RUNTIME_GC_COLLECTOR_IMMUNE_REGION_H_ 188d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier#define ART_RUNTIME_GC_COLLECTOR_IMMUNE_REGION_H_ 198d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 208d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier#include "base/macros.h" 218d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier#include "base/mutex.h" 228d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 238d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartiernamespace art { 248d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartiernamespace mirror { 258d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartierclass Object; 268d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier} // namespace mirror 278d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartiernamespace gc { 288d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartiernamespace space { 298d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartierclass ContinuousSpace; 308d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier} // namespace space 318d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 328d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartiernamespace collector { 338d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 348d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier// An immune region is a continuous region of memory for which all objects contained are assumed to 358d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier// be marked. This is used as an optimization in the GC to avoid needing to test the mark bitmap of 368d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier// the zygote, image spaces, and sometimes non moving spaces. Doing the ContainsObject check is 378d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier// faster than doing a bitmap read. There is no support for discontinuous spaces and you need to be 388d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier// careful that your immune region doesn't contain any large objects. 398d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartierclass ImmuneRegion { 408d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier public: 418d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier ImmuneRegion(); 42763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier 438d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier void Reset(); 44763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier 458d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier // Returns true if an object is inside of the immune region (assumed to be marked). 46763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier ALWAYS_INLINE bool ContainsObject(const mirror::Object* obj) const { 470e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier // Note: Relies on integer underflow behavior. 480e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier return reinterpret_cast<uintptr_t>(obj) - reinterpret_cast<uintptr_t>(begin_) < size_; 490e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier } 50763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier 510e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier void SetBegin(mirror::Object* begin) { 520e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier begin_ = begin; 530e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier UpdateSize(); 540e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier } 55763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier 560e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier void SetEnd(mirror::Object* end) { 570e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier end_ = end; 580e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier UpdateSize(); 598d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier } 608d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 61763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier mirror::Object* Begin() const { 622cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi return begin_; 632cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi } 64763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier 65763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier mirror::Object* End() const { 662cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi return end_; 672cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi } 682cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi 69df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier size_t Size() const { 70df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier return size_; 71df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier } 72df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier 738d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier private: 740e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier void UpdateSize() { 750e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier size_ = reinterpret_cast<uintptr_t>(end_) - reinterpret_cast<uintptr_t>(begin_); 768d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier } 778d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 788d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier mirror::Object* begin_; 798d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier mirror::Object* end_; 800e54cd0d8fc635d3dc8bf88a465fdade151a098fMathieu Chartier uintptr_t size_; 818d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier}; 828d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 838d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier} // namespace collector 848d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier} // namespace gc 858d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier} // namespace art 868d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier 878d562103c3a3452fb15ef4b1c64df767b70507a4Mathieu Chartier#endif // ART_RUNTIME_GC_COLLECTOR_IMMUNE_REGION_H_ 88