summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libjava/boehm.cc11
-rw-r--r--libjava/include/boehm-gc.h4
-rw-r--r--libjava/include/no-gc.h4
-rw-r--r--libjava/jvmti.cc63
-rw-r--r--libjava/nogc.cc6
5 files changed, 85 insertions, 3 deletions
diff --git a/libjava/boehm.cc b/libjava/boehm.cc
index 66860dd50da..3aa0acba987 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 7e61b8e48fb..ed8ac6aa2e3 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 193b8ea4d05..ce0ffb81017 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 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
diff --git a/libjava/nogc.cc b/libjava/nogc.cc
index 126e4de5c2b..079422d0911 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;
+}