diff options
author | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-23 21:12:10 +0000 |
---|---|---|
committer | kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-23 21:12:10 +0000 |
commit | 8428ecf5c985b4e1cc757a150b72d8cb61d766b0 (patch) | |
tree | 62db8a14a77c77177ecc18c2b244a93651c94706 /libjava/jvmti.cc | |
parent | d58a52c6639a886c34207bb9d54f6410fc22e9ba (diff) | |
download | gcc-8428ecf5c985b4e1cc757a150b72d8cb61d766b0.tar.gz |
* include/no-gc.h (_Jv_IsThreadSuspended): Declare.
* include/boehm-gc.h (_Jv_IsThreadSuspended): Likewise.
* boehm.cc (_Jv_IsThreadSuspended): New function.
* nogc.cc (_Jv_IsThreadSuspended): Likewise.
* jvmti.cc (_Jv_JVMTI_GetThreadState): New function.
(_Jv_JVMTI_Interface): Define GetThreadState.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@124082 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/jvmti.cc')
-rw-r--r-- | libjava/jvmti.cc | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index c13bb5aa397..d9bcc806074 100644 --- a/libjava/jvmti.cc +++ b/libjava/jvmti.cc @@ -30,6 +30,7 @@ details. */ #include <java/lang/OutOfMemoryError.h> #include <java/lang/Thread.h> #include <java/lang/ThreadGroup.h> +#include <java/lang/Thread$State.h> #include <java/lang/Throwable.h> #include <java/lang/VMClassLoader.h> #include <java/lang/reflect/Field.h> @@ -521,6 +522,66 @@ _Jv_JVMTI_GetFrameCount (MAYBE_UNUSED jvmtiEnv *env, jthread thread, } static jvmtiError JNICALL +_Jv_JVMTI_GetThreadState (MAYBE_UNUSED jvmtiEnv *env, jthread thread, + jint *thread_state_ptr) +{ + REQUIRE_PHASE (env, JVMTI_PHASE_LIVE); + + THREAD_DEFAULT_TO_CURRENT (thread); + THREAD_CHECK_VALID (thread); + NULL_CHECK (thread_state_ptr); + + jint state = 0; + if (thread->isAlive ()) + { + state |= JVMTI_THREAD_STATE_ALIVE; + + _Jv_Thread_t *data = _Jv_ThreadGetData (thread); + if (_Jv_IsThreadSuspended (data)) + state |= JVMTI_THREAD_STATE_SUSPENDED; + + if (thread->isInterrupted ()) + state |= JVMTI_THREAD_STATE_INTERRUPTED; + + _Jv_Frame *frame = reinterpret_cast<_Jv_Frame *> (thread->frame); + if (frame != NULL && frame->frame_type == frame_native) + state |= JVMTI_THREAD_STATE_IN_NATIVE; + + using namespace java::lang; + Thread$State *ts = thread->getState (); + if (ts == Thread$State::RUNNABLE) + state |= JVMTI_THREAD_STATE_RUNNABLE; + else if (ts == Thread$State::BLOCKED) + state |= JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER; + else if (ts == Thread$State::TIMED_WAITING + || ts == Thread$State::WAITING) + { + state |= JVMTI_THREAD_STATE_WAITING; + state |= ((ts == Thread$State::WAITING) + ? JVMTI_THREAD_STATE_WAITING_INDEFINITELY + : JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT); + + /* FIXME: We don't have a way to tell + the caller why the thread is suspended, + i.e., JVMTI_THREAD_STATE_SLEEPING, + JVMTI_THREAD_STATE_PARKED, and + JVMTI_THREAD_STATE_IN_OBJECT_WAIT + are never set. */ + } + } + else + { + using namespace java::lang; + Thread$State *ts = thread->getState (); + if (ts == Thread$State::TERMINATED) + state |= JVMTI_THREAD_STATE_TERMINATED; + } + + *thread_state_ptr = state; + return JVMTI_ERROR_NONE; +} + +static jvmtiError JNICALL _Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv *env, const char *name, jrawMonitorID *result) { @@ -2004,7 +2065,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface = UNIMPLEMENTED, // GetThreadGroupInfo UNIMPLEMENTED, // GetThreadGroupChildren _Jv_JVMTI_GetFrameCount, // GetFrameCount - UNIMPLEMENTED, // GetThreadState + _Jv_JVMTI_GetThreadState, // GetThreadState RESERVED, // reserved18 UNIMPLEMENTED, // GetFrameLocation UNIMPLEMENTED, // NotifyPopFrame |