Take responsibility for translating thread states for managed code.
Using switch lets the compiler take responsibility for keeping things in sync.
Change-Id: If0b4becd9c84901937a39045e373e0ef0ec48406
diff --git a/src/java_lang_Thread.cc b/src/java_lang_Thread.cc
index 52c5378..6ce2609 100644
--- a/src/java_lang_Thread.cc
+++ b/src/java_lang_Thread.cc
@@ -45,13 +45,34 @@
Thread::Create(managedThread, stackSize);
}
-static jint Thread_nativeGetStatus(JNIEnv* env, jobject javaThread) {
+static jint Thread_nativeGetStatus(JNIEnv* env, jobject javaThread, jboolean hasBeenStarted) {
+ // Ordinals from Java's Thread.State.
+ const jint kJavaNew = 0;
+ const jint kJavaRunnable = 1;
+ const jint kJavaBlocked = 2;
+ const jint kJavaWaiting = 3;
+ const jint kJavaTimedWaiting = 4;
+ const jint kJavaTerminated = 5;
+
+ Thread::State internal_thread_state = (hasBeenStarted ? Thread::kTerminated : Thread::kStarting);
ScopedThreadListLock thread_list_lock;
Thread* thread = Thread::FromManagedThread(env, javaThread);
- if (thread == NULL) {
- return -1;
+ if (thread != NULL) {
+ internal_thread_state = thread->GetState();
}
- return static_cast<jint>(thread->GetState());
+ switch (internal_thread_state) {
+ case Thread::kTerminated: return kJavaTerminated;
+ case Thread::kRunnable: return kJavaRunnable;
+ case Thread::kTimedWaiting: return kJavaTimedWaiting;
+ case Thread::kBlocked: return kJavaBlocked;
+ case Thread::kWaiting: return kJavaWaiting;
+ case Thread::kStarting: return kJavaNew;
+ case Thread::kNative: return kJavaRunnable;
+ case Thread::kVmWait: return kJavaWaiting;
+ case Thread::kSuspended: return kJavaRunnable;
+ // Don't add a 'default' here so the compiler can spot incompatible enum changes.
+ }
+ return -1; // Unreachable.
}
static jboolean Thread_nativeHoldsLock(JNIEnv* env, jobject javaThread, jobject javaObject) {
@@ -115,7 +136,7 @@
NATIVE_METHOD(Thread, interrupted, "()Z"),
NATIVE_METHOD(Thread, isInterrupted, "()Z"),
NATIVE_METHOD(Thread, nativeCreate, "(Ljava/lang/Thread;J)V"),
- NATIVE_METHOD(Thread, nativeGetStatus, "()I"),
+ NATIVE_METHOD(Thread, nativeGetStatus, "(Z)I"),
NATIVE_METHOD(Thread, nativeHoldsLock, "(Ljava/lang/Object;)Z"),
NATIVE_METHOD(Thread, nativeInterrupt, "()V"),
NATIVE_METHOD(Thread, nativeSetName, "(Ljava/lang/String;)V"),