summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Koji Fukui <Koji.Fukui@sony.com> 2019-03-20 19:13:00 +0900
committer Treehugger Robot <treehugger-gerrit@google.com> 2019-03-27 12:12:13 +0000
commit34857b5fd3be5ee8cf1935bd1fbaad37a8e42768 (patch)
treeeabdd26615030bde559d939eb861f02290851c9e
parent3b45890cf987c0b57965acd78958cd8eca487b8e (diff)
Revert "Revert "Change state to waiting during aborting the VM""
This reverts commit ebb481d070e3fdbb7950580e6f6886c3231a1ad9. Dex2oatWatchdogTest.TestWatchdogTrigger passed. Apply the change again. Test: ART_HEAP_POISONING=true make test-art-host-gtest-dex2oat_test64 Bug: 127875380 Change-Id: If4326990cd612815ffe1511490712ca8babfec55
-rw-r--r--openjdkjvmti/ti_monitor.cc1
-rw-r--r--openjdkjvmti/ti_thread.cc2
-rw-r--r--runtime/debugger.cc1
-rw-r--r--runtime/native/java_lang_Thread.cc1
-rw-r--r--runtime/runtime.cc9
-rw-r--r--runtime/thread_state.h1
6 files changed, 12 insertions, 3 deletions
diff --git a/openjdkjvmti/ti_monitor.cc b/openjdkjvmti/ti_monitor.cc
index aac7233303..2ca5057f85 100644
--- a/openjdkjvmti/ti_monitor.cc
+++ b/openjdkjvmti/ti_monitor.cc
@@ -403,6 +403,7 @@ jvmtiError MonitorUtil::GetCurrentContendedMonitor(jvmtiEnv* env ATTRIBUTE_UNUSE
case art::kWaitingForGetObjectsAllocated:
case art::kWaitingWeakGcRootRead:
case art::kWaitingForGcThreadFlip:
+ case art::kNativeForAbort:
case art::kStarting:
case art::kNative:
case art::kSuspended: {
diff --git a/openjdkjvmti/ti_thread.cc b/openjdkjvmti/ti_thread.cc
index c6798bb1c9..01cc8c7699 100644
--- a/openjdkjvmti/ti_thread.cc
+++ b/openjdkjvmti/ti_thread.cc
@@ -453,6 +453,7 @@ static jint GetJvmtiThreadStateFromInternal(const InternalThreadState& state) {
case art::ThreadState::kWaitingForVisitObjects:
case art::ThreadState::kWaitingForGetObjectsAllocated:
case art::ThreadState::kWaitingForGcThreadFlip:
+ case art::ThreadState::kNativeForAbort:
// All of these are causing the thread to wait for an indeterminate amount of time but isn't
// caused by sleep, park, or object#wait.
jvmti_state |= (JVMTI_THREAD_STATE_WAITING |
@@ -508,6 +509,7 @@ static jint GetJavaStateFromInternal(const InternalThreadState& state) {
case art::ThreadState::kWaitingForMethodTracingStart:
case art::ThreadState::kWaitingForVisitObjects:
case art::ThreadState::kWaitingForGcThreadFlip:
+ case art::ThreadState::kNativeForAbort:
return JVMTI_JAVA_LANG_THREAD_STATE_WAITING;
}
LOG(FATAL) << "Unreachable";
diff --git a/runtime/debugger.cc b/runtime/debugger.cc
index 26ae38a3db..3518efd907 100644
--- a/runtime/debugger.cc
+++ b/runtime/debugger.cc
@@ -2261,6 +2261,7 @@ JDWP::JdwpThreadStatus Dbg::ToJdwpThreadStatus(ThreadState state) {
case kWaitingPerformingGc:
case kWaitingWeakGcRootRead:
case kWaitingForGcThreadFlip:
+ case kNativeForAbort:
case kWaiting:
return JDWP::TS_WAIT;
// Don't add a 'default' here so the compiler can spot incompatible enum changes.
diff --git a/runtime/native/java_lang_Thread.cc b/runtime/native/java_lang_Thread.cc
index 67ad0a47b8..37b3fe642e 100644
--- a/runtime/native/java_lang_Thread.cc
+++ b/runtime/native/java_lang_Thread.cc
@@ -104,6 +104,7 @@ static jint Thread_nativeGetStatus(JNIEnv* env, jobject java_thread, jboolean ha
case kWaitingForVisitObjects: return kJavaWaiting;
case kWaitingWeakGcRootRead: return kJavaRunnable;
case kWaitingForGcThreadFlip: return kJavaWaiting;
+ case kNativeForAbort: return kJavaWaiting;
case kSuspended: return kJavaRunnable;
// Don't add a 'default' here so the compiler can spot incompatible enum changes.
}
diff --git a/runtime/runtime.cc b/runtime/runtime.cc
index 33e81bdde9..c649221f9e 100644
--- a/runtime/runtime.cc
+++ b/runtime/runtime.cc
@@ -585,9 +585,12 @@ void Runtime::Abort(const char* msg) {
#endif
}
- // Ensure that we don't have multiple threads trying to abort at once,
- // which would result in significantly worse diagnostics.
- MutexLock mu(Thread::Current(), *Locks::abort_lock_);
+ {
+ // Ensure that we don't have multiple threads trying to abort at once,
+ // which would result in significantly worse diagnostics.
+ ScopedThreadStateChange tsc(Thread::Current(), kNativeForAbort);
+ Locks::abort_lock_->ExclusiveLock(Thread::Current());
+ }
// Get any pending output out of the way.
fflush(nullptr);
diff --git a/runtime/thread_state.h b/runtime/thread_state.h
index e57a040cb1..c8f382693e 100644
--- a/runtime/thread_state.h
+++ b/runtime/thread_state.h
@@ -47,6 +47,7 @@ enum ThreadState {
kWaitingForGetObjectsAllocated, // WAITING TS_WAIT waiting for getting the number of allocated objects
kWaitingWeakGcRootRead, // WAITING TS_WAIT waiting on the GC to read a weak root
kWaitingForGcThreadFlip, // WAITING TS_WAIT waiting on the GC thread flip (CC collector) to finish
+ kNativeForAbort, // WAITING TS_WAIT checking other threads are not run on abort.
kStarting, // NEW TS_WAIT native thread started, not yet ready to run managed code
kNative, // RUNNABLE TS_RUNNING running in a JNI native method
kSuspended, // RUNNABLE TS_RUNNING suspended by GC or debugger