summaryrefslogtreecommitdiffstats
path: root/runtime/native/java_lang_Thread.cc
diff options
context:
space:
mode:
authorIan Rogers <irogers@google.com>2014-07-17 18:52:42 -0700
committerIan Rogers <irogers@google.com>2014-07-17 18:59:40 -0700
commitf3d874c60ee3ada19ce26a5c4e532312b6f3a9e9 (patch)
treede14ab8b610f43a2c2c4c02f4ac67d614919fde2 /runtime/native/java_lang_Thread.cc
parent031ddea20cb311dfdb3bd16a13750f9cb426b299 (diff)
downloadart-f3d874c60ee3ada19ce26a5c4e532312b6f3a9e9.tar.gz
art-f3d874c60ee3ada19ce26a5c4e532312b6f3a9e9.tar.bz2
art-f3d874c60ee3ada19ce26a5c4e532312b6f3a9e9.zip
Avoid race in single thread suspension.
Don't allow more than one concurrent single thread suspension to avoid potential cycles and deadlocks where threads try to suspend each other. Bug: 16364458, 16354227 Change-Id: I907f1d5591a6aa5c241d37d6b4a34f968f98df77
Diffstat (limited to 'runtime/native/java_lang_Thread.cc')
-rw-r--r--runtime/native/java_lang_Thread.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/runtime/native/java_lang_Thread.cc b/runtime/native/java_lang_Thread.cc
index bae67f20e8..8f83f96318 100644
--- a/runtime/native/java_lang_Thread.cc
+++ b/runtime/native/java_lang_Thread.cc
@@ -116,18 +116,25 @@ static void Thread_nativeInterrupt(JNIEnv* env, jobject java_thread) {
static void Thread_nativeSetName(JNIEnv* env, jobject peer, jstring java_name) {
ScopedUtfChars name(env, java_name);
+ Thread* self;
{
ScopedObjectAccess soa(env);
if (soa.Decode<mirror::Object*>(peer) == soa.Self()->GetPeer()) {
soa.Self()->SetThreadName(name.c_str());
return;
}
+ self = soa.Self();
}
// 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.
bool timed_out;
- Thread* thread = ThreadList::SuspendThreadByPeer(peer, true, false, &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);
+ }
if (thread != NULL) {
{
ScopedObjectAccess soa(env);