/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "immune_region.h" #include "gc/space/space-inl.h" #include "mirror/object.h" namespace art { namespace gc { namespace collector { ImmuneRegion::ImmuneRegion() { Reset(); } void ImmuneRegion::Reset() { SetBegin(nullptr); SetEnd(nullptr); } bool ImmuneRegion::AddContinuousSpace(space::ContinuousSpace* space) { // Bind live to mark bitmap if necessary. if (space->GetLiveBitmap() != space->GetMarkBitmap()) { CHECK(space->IsContinuousMemMapAllocSpace()); space->AsContinuousMemMapAllocSpace()->BindLiveToMarkBitmap(); } mirror::Object* space_begin = reinterpret_cast<mirror::Object*>(space->Begin()); mirror::Object* space_limit = reinterpret_cast<mirror::Object*>(space->Limit()); if (IsEmpty()) { SetBegin(space_begin); SetEnd(space_limit); } else { if (space_limit <= begin_) { // Space is before the immune region. SetBegin(space_begin); } else if (space_begin >= end_) { // Space is after the immune region. SetEnd(space_limit); } else { return false; } } return true; } bool ImmuneRegion::ContainsSpace(const space::ContinuousSpace* space) const { bool contains = begin_ <= reinterpret_cast<mirror::Object*>(space->Begin()) && end_ >= reinterpret_cast<mirror::Object*>(space->Limit()); if (kIsDebugBuild && contains) { // A bump pointer space shoult not be in the immune region. DCHECK(space->GetType() != space::kSpaceTypeBumpPointerSpace); } return contains; } } // namespace collector } // namespace gc } // namespace art