From ba32de47e32f436d7c11cb4a2e78bdd4ad4dc5d2 Mon Sep 17 00:00:00 2001 From: Brian Carlstrom Date: Wed, 27 Aug 2014 23:43:46 -0700 Subject: Fix issue with Thread.setName hanging after Thread.start When suspending a thread by peer the invariant that only attached threads are suspended must be maintained. Add a ThreadList::Contains check which requires making this method non-static. Add some extra thread logging. Bug: 17302037 (cherry picked from commit 37c16453a92bbf1a47f042000318a1b60381017d) Change-Id: I51832785d4b4b431e035318e75635f442e89a1fb --- runtime/native/java_lang_Thread.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'runtime/native/java_lang_Thread.cc') diff --git a/runtime/native/java_lang_Thread.cc b/runtime/native/java_lang_Thread.cc index 8f83f96318..c0c72651de 100644 --- a/runtime/native/java_lang_Thread.cc +++ b/runtime/native/java_lang_Thread.cc @@ -128,19 +128,20 @@ static void Thread_nativeSetName(JNIEnv* env, jobject peer, jstring java_name) { // Suspend thread to avoid it from killing itself while we set its name. We don't just hold the // thread list lock to avoid this, as setting the thread name causes mutator to lock/unlock // in the DDMS send code. + ThreadList* thread_list = Runtime::Current()->GetThreadList(); bool timed_out; // Take suspend thread lock to avoid races with threads trying to suspend this one. Thread* thread; { MutexLock mu(self, *Locks::thread_list_suspend_thread_lock_); - thread = ThreadList::SuspendThreadByPeer(peer, true, false, &timed_out); + thread = thread_list->SuspendThreadByPeer(peer, true, false, &timed_out); } if (thread != NULL) { { ScopedObjectAccess soa(env); thread->SetThreadName(name.c_str()); } - Runtime::Current()->GetThreadList()->Resume(thread, false); + thread_list->Resume(thread, false); } else if (timed_out) { LOG(ERROR) << "Trying to set thread name to '" << name.c_str() << "' failed as the thread " "failed to suspend within a generous timeout."; -- cgit v1.2.3-59-g8ed1b