summaryrefslogtreecommitdiffstats
path: root/runtime/gc/collector/immune_region.cc
diff options
context:
space:
mode:
authorMathieu Chartier <mathieuc@google.com>2014-03-12 17:42:10 -0700
committerMathieu Chartier <mathieuc@google.com>2014-03-13 10:06:28 -0700
commit8d562103c3a3452fb15ef4b1c64df767b70507a4 (patch)
treed9fe8cacae77f597d676beb5086c03086f54e262 /runtime/gc/collector/immune_region.cc
parentca46e2003360b44f4c043f6da87092592bc3d6d6 (diff)
downloadart-8d562103c3a3452fb15ef4b1c64df767b70507a4.zip
art-8d562103c3a3452fb15ef4b1c64df767b70507a4.tar.gz
art-8d562103c3a3452fb15ef4b1c64df767b70507a4.tar.bz2
Refactor immune region logic into its own file.
Added immune_region.cc/.h in the collector directory. Changed the functionality to no longer assume spaces are added to immune region in ascending order. Change-Id: Id1d643b3849ad2695e8a151dbbb74a5035644472
Diffstat (limited to 'runtime/gc/collector/immune_region.cc')
-rw-r--r--runtime/gc/collector/immune_region.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/runtime/gc/collector/immune_region.cc b/runtime/gc/collector/immune_region.cc
new file mode 100644
index 0000000..9e65384
--- /dev/null
+++ b/runtime/gc/collector/immune_region.cc
@@ -0,0 +1,66 @@
+/*
+ * 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() {
+ begin_ = nullptr;
+ end_ = 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()) {
+ begin_ = space_begin;
+ end_ = space_limit;
+ } else {
+ if (space_limit <= begin_) { // Space is before the immune region.
+ begin_ = space_begin;
+ } else if (space_begin >= end_) { // Space is after the immune region.
+ end_ = space_limit;
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool ImmuneRegion::ContainsSpace(const space::ContinuousSpace* space) const {
+ return
+ begin_ <= reinterpret_cast<mirror::Object*>(space->Begin()) &&
+ end_ >= reinterpret_cast<mirror::Object*>(space->Limit());
+}
+
+} // namespace collector
+} // namespace gc
+} // namespace art