Make moving space compaction concurrent using userfaultfd
Bug: 160737021
Test: art/test/testrunner/testrunner.py
Change-Id: I09d9d49ddb4472a6864fdb7f32da5ffb7bc60c30
diff --git a/runtime/jit/jit_code_cache.cc b/runtime/jit/jit_code_cache.cc
index 6c83741..199a00b 100644
--- a/runtime/jit/jit_code_cache.cc
+++ b/runtime/jit/jit_code_cache.cc
@@ -1594,16 +1594,21 @@
}
void JitCodeCache::VisitRoots(RootVisitor* visitor) {
- MutexLock mu(Thread::Current(), *Locks::jit_lock_);
- UnbufferedRootVisitor root_visitor(visitor, RootInfo(kRootStickyClass));
- for (ArtMethod* method : current_optimized_compilations_) {
- method->VisitRoots(root_visitor, kRuntimePointerSize);
- }
- for (ArtMethod* method : current_baseline_compilations_) {
- method->VisitRoots(root_visitor, kRuntimePointerSize);
- }
- for (ArtMethod* method : current_osr_compilations_) {
- method->VisitRoots(root_visitor, kRuntimePointerSize);
+ Thread* self = Thread::Current();
+ gc::Heap* const heap = Runtime::Current()->GetHeap();
+ if (heap->CurrentCollectorType() != gc::CollectorType::kCollectorTypeCMC
+ || !heap->MarkCompactCollector()->IsCompacting(self)) {
+ MutexLock mu(self, *Locks::jit_lock_);
+ UnbufferedRootVisitor root_visitor(visitor, RootInfo(kRootStickyClass));
+ for (ArtMethod* method : current_optimized_compilations_) {
+ method->VisitRoots(root_visitor, kRuntimePointerSize);
+ }
+ for (ArtMethod* method : current_baseline_compilations_) {
+ method->VisitRoots(root_visitor, kRuntimePointerSize);
+ }
+ for (ArtMethod* method : current_osr_compilations_) {
+ method->VisitRoots(root_visitor, kRuntimePointerSize);
+ }
}
}