Clean up tracking new roots, do not track them for CC.
This addresses comments from
https://android-review.googlesource.com/321552
Test: ART_USE_READ_BARRIER=false testrunner.py -b --host
Test: ART_USE_READ_BARRIER=true testrunner.py -b --host
Bug: 30627598
Change-Id: I9740e599fe8170201a3b5f10113bbeb0dee500fe
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index d02cf17..1d95615 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -1908,6 +1908,13 @@
const bool tracing_enabled = Trace::IsTracingEnabled();
Thread* const self = Thread::Current();
WriterMutexLock mu(self, *Locks::classlinker_classes_lock_);
+ if (kUseReadBarrier) {
+ // We do not track new roots for CC.
+ DCHECK_EQ(0, flags & (kVisitRootFlagNewRoots |
+ kVisitRootFlagClearRootLog |
+ kVisitRootFlagStartLoggingNewRoots |
+ kVisitRootFlagStopLoggingNewRoots));
+ }
if ((flags & kVisitRootFlagAllRoots) != 0) {
// Argument for how root visiting deals with ArtField and ArtMethod roots.
// There is 3 GC cases to handle:
@@ -1937,7 +1944,7 @@
root.VisitRoot(visitor, RootInfo(kRootVMInternal));
}
}
- } else if ((flags & kVisitRootFlagNewRoots) != 0) {
+ } else if (!kUseReadBarrier && (flags & kVisitRootFlagNewRoots) != 0) {
for (auto& root : new_class_roots_) {
ObjPtr<mirror::Class> old_ref = root.Read<kWithoutReadBarrier>();
root.VisitRoot(visitor, RootInfo(kRootStickyClass));
@@ -1958,13 +1965,13 @@
}
}
}
- if ((flags & kVisitRootFlagClearRootLog) != 0) {
+ if (!kUseReadBarrier && (flags & kVisitRootFlagClearRootLog) != 0) {
new_class_roots_.clear();
new_bss_roots_boot_oat_files_.clear();
}
- if ((flags & kVisitRootFlagStartLoggingNewRoots) != 0) {
+ if (!kUseReadBarrier && (flags & kVisitRootFlagStartLoggingNewRoots) != 0) {
log_new_roots_ = true;
- } else if ((flags & kVisitRootFlagStopLoggingNewRoots) != 0) {
+ } else if (!kUseReadBarrier && (flags & kVisitRootFlagStopLoggingNewRoots) != 0) {
log_new_roots_ = false;
}
// We deliberately ignore the class roots in the image since we
@@ -3757,10 +3764,14 @@
}
void ClassLinker::WriteBarrierForBootOatFileBssRoots(const OatFile* oat_file) {
- WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
- DCHECK(!oat_file->GetBssGcRoots().empty()) << oat_file->GetLocation();
- if (log_new_roots_ && !ContainsElement(new_bss_roots_boot_oat_files_, oat_file)) {
- new_bss_roots_boot_oat_files_.push_back(oat_file);
+ if (!kUseReadBarrier) {
+ WriterMutexLock mu(Thread::Current(), *Locks::classlinker_classes_lock_);
+ DCHECK(!oat_file->GetBssGcRoots().empty()) << oat_file->GetLocation();
+ if (log_new_roots_ && !ContainsElement(new_bss_roots_boot_oat_files_, oat_file)) {
+ new_bss_roots_boot_oat_files_.push_back(oat_file);
+ }
+ } else {
+ LOG(FATAL) << "UNREACHABLE";
}
}