diff options
-rw-r--r-- | libjava/boehm.cc | 11 | ||||
-rw-r--r-- | libjava/include/boehm-gc.h | 4 | ||||
-rw-r--r-- | libjava/include/no-gc.h | 4 | ||||
-rw-r--r-- | libjava/jvmti.cc | 63 | ||||
-rw-r--r-- | libjava/nogc.cc | 6 |
5 files changed, 85 insertions, 3 deletions
diff --git a/libjava/boehm.cc b/libjava/boehm.cc index 66860dd..3aa0acb 100644 --- a/libjava/boehm.cc +++ b/libjava/boehm.cc @@ -722,6 +722,17 @@ _Jv_ResumeThread (_Jv_Thread_t *thread) #endif } +int +_Jv_IsThreadSuspended (_Jv_Thread_t *thread) +{ +#if defined(GC_PTHREADS) && !defined(GC_SOLARIS_THREADS) \ + && !defined(GC_WIN32_THREADS) && !defined(GC_DARWIN_THREADS) + return GC_is_thread_suspended (_Jv_GetPlatformThreadID (thread)); +#else + return 0; +#endif +} + void _Jv_GCAttachThread () { diff --git a/libjava/include/boehm-gc.h b/libjava/include/boehm-gc.h index 7e61b8e..ed8ac6a 100644 --- a/libjava/include/boehm-gc.h +++ b/libjava/include/boehm-gc.h @@ -1,7 +1,7 @@ // -*- c++ -*- // boehm-gc.h - Defines for Boehm collector. -/* Copyright (C) 1998, 1999, 2002, 2004, 2006 Free Software Foundation +/* Copyright (C) 1998, 1999, 2002, 2004, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -93,4 +93,6 @@ extern "C" void _Jv_SuspendThread (_Jv_Thread_t *); // Resume a suspended thread. extern "C" void _Jv_ResumeThread (_Jv_Thread_t *); +// Is the given thread suspended? +extern "C" int _Jv_IsThreadSuspended (_Jv_Thread_t *); #endif /* __JV_BOEHM_GC__ */ diff --git a/libjava/include/no-gc.h b/libjava/include/no-gc.h index 193b8ea..ce0ffb8 100644 --- a/libjava/include/no-gc.h +++ b/libjava/include/no-gc.h @@ -1,7 +1,7 @@ // -*- c++ -*- // no-gc.h - Defines for no garbage collector. -/* Copyright (C) 1998, 1999, 2006 Free Software Foundation +/* Copyright (C) 1998, 1999, 2006, 2007 Free Software Foundation This file is part of libgcj. @@ -18,4 +18,6 @@ extern "C" void _Jv_SuspendThread (_Jv_Thread_t *); // Resume a suspended thread. extern "C" void _Jv_ResumeThread (_Jv_Thread_t *); +// Is the given thread suspended? +extern "C" int _Jv_IsThreadSuspended (_Jv_Thread_t *); #endif /* __JV_NO_GC__ */ diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index c13bb5a..d9bcc80 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 diff --git a/libjava/nogc.cc b/libjava/nogc.cc index 126e4de..079422d 100644 --- a/libjava/nogc.cc +++ b/libjava/nogc.cc @@ -184,3 +184,9 @@ void _Jv_ResumeThread (_Jv_Thread_t *thread) { } + +int +_Jv_IsThreadSuspended (_Jv_Thread_t *thread) +{ + return 0; +} |