Fix a deadlock in the CC collector.
Fix a deadlock between CC GC disabling system weaks and thread attach.
See 31500969#2 for more details.
Bug: 31500969
Bug: 12687968
Test: test-art-host with CC. N9 libartd boot. Ritz EAAC.
Change-Id: Ic9a8bfb1c636643a03f4580b811fe890273576b6
diff --git a/runtime/thread_list.cc b/runtime/thread_list.cc
index ab1f198..5e6c8a4 100644
--- a/runtime/thread_list.cc
+++ b/runtime/thread_list.cc
@@ -284,7 +284,7 @@
}
}
-size_t ThreadList::RunCheckpoint(Closure* checkpoint_function) {
+size_t ThreadList::RunCheckpoint(Closure* checkpoint_function, Closure* callback) {
Thread* self = Thread::Current();
Locks::mutator_lock_->AssertNotExclusiveHeld(self);
Locks::thread_list_lock_->AssertNotHeld(self);
@@ -318,6 +318,10 @@
}
}
}
+ // Run the callback to be called inside this critical section.
+ if (callback != nullptr) {
+ callback->Run(self);
+ }
}
// Run the checkpoint on ourself while we wait for threads to suspend.