| /* |
| * 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 |