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