jvmti.cc (_Jv_JVMTI_GetAllThreads): New function.
2007-01-16 Kyle Galloway <kgallowa@redhat.com> * jvmti.cc (_Jv_JVMTI_GetAllThreads): New function. * testsuite/libjava.jvmti/getallthreads.java: New test. * testsuite/libjava.jvmti/natgetallthreads.cc: Ditto. * testsuite/libjava.jvmti/getallthreads.out: Ditto. * testsuite/libjava.jvmti/getallthreads.h: Ditto. * testsuite/libjava.jvmti/getallthreads.jar: Ditto. From-SVN: r120827
This commit is contained in:
parent
878aa81717
commit
05794ce850
|
@ -1,3 +1,12 @@
|
||||||
|
2007-01-16 Kyle Galloway <kgallowa@redhat.com>
|
||||||
|
|
||||||
|
* jvmti.cc (_Jv_JVMTI_GetAllThreads): New function.
|
||||||
|
* testsuite/libjava.jvmti/getallthreads.java: New test.
|
||||||
|
* testsuite/libjava.jvmti/natgetallthreads.cc: Ditto.
|
||||||
|
* testsuite/libjava.jvmti/getallthreads.out: Ditto.
|
||||||
|
* testsuite/libjava.jvmti/getallthreads.h: Ditto.
|
||||||
|
* testsuite/libjava.jvmti/getallthreads.jar: Ditto.
|
||||||
|
|
||||||
2007-01-15 Keith Seitz <keiths@redhat.com>
|
2007-01-15 Keith Seitz <keiths@redhat.com>
|
||||||
|
|
||||||
* gnu/classpath/jdwp/natVMVirtualMachine.cc (suspendThread): Use
|
* gnu/classpath/jdwp/natVMVirtualMachine.cc (suspendThread): Use
|
||||||
|
|
|
@ -28,7 +28,9 @@ details. */
|
||||||
#include <java/lang/Class.h>
|
#include <java/lang/Class.h>
|
||||||
#include <java/lang/ClassLoader.h>
|
#include <java/lang/ClassLoader.h>
|
||||||
#include <java/lang/Object.h>
|
#include <java/lang/Object.h>
|
||||||
|
#include <java/lang/OutOfMemoryError.h>
|
||||||
#include <java/lang/Thread.h>
|
#include <java/lang/Thread.h>
|
||||||
|
#include <java/lang/ThreadGroup.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>
|
||||||
|
@ -196,6 +198,51 @@ _Jv_JVMTI_InterruptThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
|
||||||
return JVMTI_ERROR_NONE;
|
return JVMTI_ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jvmtiError
|
||||||
|
_Jv_JVMTI_GetAllThreads(MAYBE_UNUSED jvmtiEnv *env, jint *thread_cnt,
|
||||||
|
jthread **threads)
|
||||||
|
{
|
||||||
|
REQUIRE_PHASE (env, JVMTI_PHASE_LIVE);
|
||||||
|
NULL_CHECK (thread_cnt);
|
||||||
|
NULL_CHECK (threads);
|
||||||
|
|
||||||
|
using namespace java::lang;
|
||||||
|
Thread *thr = Thread::currentThread ();
|
||||||
|
|
||||||
|
ThreadGroup *root_grp = ThreadGroup::root;
|
||||||
|
jint estimate = root_grp->activeCount ();
|
||||||
|
|
||||||
|
JArray<Thread *> *thr_arr;
|
||||||
|
|
||||||
|
// Allocate some extra space since threads can be created between calls
|
||||||
|
try
|
||||||
|
{
|
||||||
|
thr_arr
|
||||||
|
= reinterpret_cast<JArray<Thread *> *> (JvNewObjectArray
|
||||||
|
((estimate * 2),
|
||||||
|
&Thread::class$, NULL));
|
||||||
|
}
|
||||||
|
catch (java::lang::OutOfMemoryError *err)
|
||||||
|
{
|
||||||
|
return JVMTI_ERROR_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
*thread_cnt = root_grp->enumerate (thr_arr);
|
||||||
|
|
||||||
|
jvmtiError jerr = env->Allocate ((jlong) ((*thread_cnt) * sizeof (jthread)),
|
||||||
|
(unsigned char **) threads);
|
||||||
|
|
||||||
|
if (jerr != JVMTI_ERROR_NONE)
|
||||||
|
return jerr;
|
||||||
|
|
||||||
|
// Transfer the threads to the result array
|
||||||
|
jthread *tmp_arr = reinterpret_cast<jthread *> (elements (thr_arr));
|
||||||
|
|
||||||
|
memcpy ((*threads), tmp_arr, (*thread_cnt));
|
||||||
|
|
||||||
|
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)
|
||||||
|
@ -1362,7 +1409,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
|
||||||
RESERVED, // reserved1
|
RESERVED, // reserved1
|
||||||
_Jv_JVMTI_SetEventNotificationMode, // SetEventNotificationMode
|
_Jv_JVMTI_SetEventNotificationMode, // SetEventNotificationMode
|
||||||
RESERVED, // reserved3
|
RESERVED, // reserved3
|
||||||
UNIMPLEMENTED, // GetAllThreads
|
_Jv_JVMTI_GetAllThreads, // GetAllThreads
|
||||||
_Jv_JVMTI_SuspendThread, // SuspendThread
|
_Jv_JVMTI_SuspendThread, // SuspendThread
|
||||||
_Jv_JVMTI_ResumeThread, // ResumeThread
|
_Jv_JVMTI_ResumeThread, // ResumeThread
|
||||||
UNIMPLEMENTED, // StopThread
|
UNIMPLEMENTED, // StopThread
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-
|
||||||
|
|
||||||
|
#ifndef __getallthreads__
|
||||||
|
#define __getallthreads__
|
||||||
|
|
||||||
|
#pragma interface
|
||||||
|
|
||||||
|
#include <java/lang/Thread.h>
|
||||||
|
#include <gcj/array.h>
|
||||||
|
|
||||||
|
extern "Java"
|
||||||
|
{
|
||||||
|
class getallthreads;
|
||||||
|
}
|
||||||
|
|
||||||
|
class getallthreads : public ::java::lang::Thread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
getallthreads ();
|
||||||
|
static void do_getallthreads_tests ();
|
||||||
|
virtual void run ();
|
||||||
|
virtual void natPlaceholder ();
|
||||||
|
virtual void natRunner ();
|
||||||
|
virtual void placeholder ();
|
||||||
|
virtual void runner ();
|
||||||
|
static void main (JArray< ::java::lang::String *> *);
|
||||||
|
static jint thread_num;
|
||||||
|
static ::java::util::ArrayList *threads;
|
||||||
|
jint __attribute__((aligned(__alignof__( ::java::lang::Thread )))) ex_frames;
|
||||||
|
jboolean done;
|
||||||
|
|
||||||
|
static ::java::lang::Class class$;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __getallthreads__ */
|
Binary file not shown.
|
@ -0,0 +1,80 @@
|
||||||
|
// Test JVMTI GetAllThreads
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class getallthreads extends Thread
|
||||||
|
{
|
||||||
|
public static int thread_num;
|
||||||
|
public static ArrayList threads;
|
||||||
|
|
||||||
|
public int ex_frames;
|
||||||
|
public boolean done = false;
|
||||||
|
|
||||||
|
public static native void do_getallthreads_tests ();
|
||||||
|
|
||||||
|
public void run ()
|
||||||
|
{
|
||||||
|
ex_frames = thread_num;
|
||||||
|
thread_num++;
|
||||||
|
|
||||||
|
if (ex_frames > 0)
|
||||||
|
{
|
||||||
|
if ((ex_frames % 2) == 0)
|
||||||
|
placeholder ();
|
||||||
|
else
|
||||||
|
natPlaceholder ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
runner ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public native void natPlaceholder ();
|
||||||
|
public native void natRunner ();
|
||||||
|
|
||||||
|
public void placeholder ()
|
||||||
|
{
|
||||||
|
ex_frames--;
|
||||||
|
|
||||||
|
if (ex_frames > 0)
|
||||||
|
{
|
||||||
|
if ((thread_num % 2) == 0)
|
||||||
|
placeholder ();
|
||||||
|
else
|
||||||
|
natPlaceholder ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
runner ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runner ()
|
||||||
|
{
|
||||||
|
done = true;
|
||||||
|
while (done)
|
||||||
|
yield ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main (String[] args)
|
||||||
|
{
|
||||||
|
System.out.println ("JVMTI GetAllThreads tests");
|
||||||
|
threads = new ArrayList (20);
|
||||||
|
|
||||||
|
getallthreads t;
|
||||||
|
|
||||||
|
for (int i = 0; i < 20; i++)
|
||||||
|
{
|
||||||
|
t = new getallthreads ();
|
||||||
|
threads.add (t);
|
||||||
|
t.start ();
|
||||||
|
while (!t.done)
|
||||||
|
yield ();
|
||||||
|
}
|
||||||
|
|
||||||
|
do_getallthreads_tests ();
|
||||||
|
|
||||||
|
for (int i = 0; i < 20; i++)
|
||||||
|
{
|
||||||
|
t = (getallthreads) threads.get(i);
|
||||||
|
t.done = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
JVMTI GetAllThreads tests
|
||||||
|
Found thread 1
|
||||||
|
Found thread 2
|
||||||
|
Found thread 3
|
||||||
|
Found thread 4
|
||||||
|
Found thread 5
|
||||||
|
Found thread 6
|
||||||
|
Found thread 7
|
||||||
|
Found thread 8
|
||||||
|
Found thread 9
|
||||||
|
Found thread 10
|
||||||
|
Found thread 11
|
||||||
|
Found thread 12
|
||||||
|
Found thread 13
|
||||||
|
Found thread 14
|
||||||
|
Found thread 15
|
||||||
|
Found thread 16
|
||||||
|
Found thread 17
|
||||||
|
Found thread 18
|
||||||
|
Found thread 19
|
||||||
|
Found thread 20
|
||||||
|
Found thread 21
|
||||||
|
Found thread 22
|
|
@ -0,0 +1,55 @@
|
||||||
|
#include <gcj/cni.h>
|
||||||
|
|
||||||
|
#include <jvm.h>
|
||||||
|
#include <jvmti.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "jvmti-int.h"
|
||||||
|
#include "getallthreads.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
getallthreads::natPlaceholder ()
|
||||||
|
{
|
||||||
|
ex_frames--;
|
||||||
|
|
||||||
|
if (ex_frames > 0)
|
||||||
|
{
|
||||||
|
if ((getallthreads::thread_num % 2) == 0)
|
||||||
|
placeholder ();
|
||||||
|
else
|
||||||
|
natPlaceholder ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
natRunner ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
getallthreads::natRunner ()
|
||||||
|
{
|
||||||
|
done = true;
|
||||||
|
while (done)
|
||||||
|
yield ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
getallthreads::do_getallthreads_tests ()
|
||||||
|
{
|
||||||
|
jvmtiEnv *env;
|
||||||
|
JavaVM *vm = _Jv_GetJavaVM ();
|
||||||
|
vm->GetEnv (reinterpret_cast<void **> (&env), JVMTI_VERSION_1_0);
|
||||||
|
|
||||||
|
jint num_threads;
|
||||||
|
jthread *thread_arr;
|
||||||
|
|
||||||
|
jvmtiError jerr = env->GetAllThreads (&num_threads, &thread_arr);
|
||||||
|
if (jerr != JVMTI_ERROR_NONE)
|
||||||
|
{
|
||||||
|
printf ("Test Failed, JVMTI Error!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
env->Deallocate (reinterpret_cast<unsigned char *> (thread_arr));
|
||||||
|
|
||||||
|
for (int i = 0; i < num_threads; i++)
|
||||||
|
printf ("Found thread %d\n", i+1 );
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue