Fix occasional deadlock caused by checkpoint root marking.
There was a race where a new worker thread would attach during the
checkpoint. This caused the thread to wait since suspend count != 0.
But when we decremented the suspend count, we did not broadcast to
the resume condition.
Added a create peer parameter to Thread::Attach and
AttachCurrentThread. This is used by the threadpool since we don't
need a java peer for worker threads.
Change-Id: I632926b5a6b52eeb0684b6e1dcbf3db42ba3d35c
diff --git a/src/runtime.cc b/src/runtime.cc
index 100a198..6dc8435 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -786,9 +786,11 @@
Thread::Startup();
- // ClassLinker needs an attached thread, but we can't fully attach a thread
- // without creating objects. We can't supply a thread group yet; it will be fixed later.
- Thread* self = Thread::Attach("main", false, NULL);
+ // ClassLinker needs an attached thread, but we can't fully attach a thread without creating
+ // objects. We can't supply a thread group yet; it will be fixed later. Since we are the main
+ // thread, we do not get a java peer.
+ Thread* self = Thread::Attach("main", false, NULL, false);
+ CHECK_EQ(self->thin_lock_id_, ThreadList::kMainId);
CHECK(self != NULL);
// Set us to runnable so tools using a runtime can allocate and GC by default
@@ -984,8 +986,9 @@
signals.Block();
}
-bool Runtime::AttachCurrentThread(const char* thread_name, bool as_daemon, jobject thread_group) {
- bool success = Thread::Attach(thread_name, as_daemon, thread_group) != NULL;
+bool Runtime::AttachCurrentThread(const char* thread_name, bool as_daemon, jobject thread_group,
+ bool create_peer) {
+ bool success = Thread::Attach(thread_name, as_daemon, thread_group, create_peer) != NULL;
if (thread_name == NULL) {
LOG(WARNING) << *Thread::Current() << " attached without supplying a name";
}