mirror of git://gcc.gnu.org/git/gcc.git
no-gc.h (_Jv_IsThreadSuspended): Declare.
* 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. From-SVN: r124082
This commit is contained in:
parent
494d64aff6
commit
22099c59a2
|
@ -722,6 +722,17 @@ _Jv_ResumeThread (_Jv_Thread_t *thread)
|
||||||
#endif
|
#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
|
void
|
||||||
_Jv_GCAttachThread ()
|
_Jv_GCAttachThread ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// -*- c++ -*-
|
// -*- c++ -*-
|
||||||
// boehm-gc.h - Defines for Boehm collector.
|
// 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.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
@ -93,4 +93,6 @@ extern "C" void _Jv_SuspendThread (_Jv_Thread_t *);
|
||||||
// Resume a suspended thread.
|
// Resume a suspended thread.
|
||||||
extern "C" void _Jv_ResumeThread (_Jv_Thread_t *);
|
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__ */
|
#endif /* __JV_BOEHM_GC__ */
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// -*- c++ -*-
|
// -*- c++ -*-
|
||||||
// no-gc.h - Defines for no garbage collector.
|
// 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.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
@ -18,4 +18,6 @@ extern "C" void _Jv_SuspendThread (_Jv_Thread_t *);
|
||||||
// Resume a suspended thread.
|
// Resume a suspended thread.
|
||||||
extern "C" void _Jv_ResumeThread (_Jv_Thread_t *);
|
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__ */
|
#endif /* __JV_NO_GC__ */
|
||||||
|
|
|
@ -30,6 +30,7 @@ details. */
|
||||||
#include <java/lang/OutOfMemoryError.h>
|
#include <java/lang/OutOfMemoryError.h>
|
||||||
#include <java/lang/Thread.h>
|
#include <java/lang/Thread.h>
|
||||||
#include <java/lang/ThreadGroup.h>
|
#include <java/lang/ThreadGroup.h>
|
||||||
|
#include <java/lang/Thread$State.h>
|
||||||
#include <java/lang/Throwable.h>
|
#include <java/lang/Throwable.h>
|
||||||
#include <java/lang/VMClassLoader.h>
|
#include <java/lang/VMClassLoader.h>
|
||||||
#include <java/lang/reflect/Field.h>
|
#include <java/lang/reflect/Field.h>
|
||||||
|
@ -520,6 +521,66 @@ _Jv_JVMTI_GetFrameCount (MAYBE_UNUSED jvmtiEnv *env, jthread thread,
|
||||||
return JVMTI_ERROR_NONE;
|
return JVMTI_ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static jvmtiError JNICALL
|
||||||
_Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv *env, const char *name,
|
_Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv *env, const char *name,
|
||||||
jrawMonitorID *result)
|
jrawMonitorID *result)
|
||||||
|
@ -2004,7 +2065,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
|
||||||
UNIMPLEMENTED, // GetThreadGroupInfo
|
UNIMPLEMENTED, // GetThreadGroupInfo
|
||||||
UNIMPLEMENTED, // GetThreadGroupChildren
|
UNIMPLEMENTED, // GetThreadGroupChildren
|
||||||
_Jv_JVMTI_GetFrameCount, // GetFrameCount
|
_Jv_JVMTI_GetFrameCount, // GetFrameCount
|
||||||
UNIMPLEMENTED, // GetThreadState
|
_Jv_JVMTI_GetThreadState, // GetThreadState
|
||||||
RESERVED, // reserved18
|
RESERVED, // reserved18
|
||||||
UNIMPLEMENTED, // GetFrameLocation
|
UNIMPLEMENTED, // GetFrameLocation
|
||||||
UNIMPLEMENTED, // NotifyPopFrame
|
UNIMPLEMENTED, // NotifyPopFrame
|
||||||
|
|
|
@ -184,3 +184,9 @@ void
|
||||||
_Jv_ResumeThread (_Jv_Thread_t *thread)
|
_Jv_ResumeThread (_Jv_Thread_t *thread)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_Jv_IsThreadSuspended (_Jv_Thread_t *thread)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue