mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-04 22:40:16 +08:00
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>
|
||||
|
||||
* gnu/classpath/jdwp/natVMVirtualMachine.cc (suspendThread): Use
|
||||
|
@ -28,7 +28,9 @@ details. */
|
||||
#include <java/lang/Class.h>
|
||||
#include <java/lang/ClassLoader.h>
|
||||
#include <java/lang/Object.h>
|
||||
#include <java/lang/OutOfMemoryError.h>
|
||||
#include <java/lang/Thread.h>
|
||||
#include <java/lang/ThreadGroup.h>
|
||||
#include <java/lang/Throwable.h>
|
||||
#include <java/lang/VMClassLoader.h>
|
||||
#include <java/lang/reflect/Field.h>
|
||||
@ -196,6 +198,51 @@ _Jv_JVMTI_InterruptThread (MAYBE_UNUSED jvmtiEnv *env, jthread thread)
|
||||
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
|
||||
_Jv_JVMTI_CreateRawMonitor (MAYBE_UNUSED jvmtiEnv *env, const char *name,
|
||||
jrawMonitorID *result)
|
||||
@ -1362,7 +1409,7 @@ struct _Jv_jvmtiEnv _Jv_JVMTI_Interface =
|
||||
RESERVED, // reserved1
|
||||
_Jv_JVMTI_SetEventNotificationMode, // SetEventNotificationMode
|
||||
RESERVED, // reserved3
|
||||
UNIMPLEMENTED, // GetAllThreads
|
||||
_Jv_JVMTI_GetAllThreads, // GetAllThreads
|
||||
_Jv_JVMTI_SuspendThread, // SuspendThread
|
||||
_Jv_JVMTI_ResumeThread, // ResumeThread
|
||||
UNIMPLEMENTED, // StopThread
|
||||
|
35
libjava/testsuite/libjava.jvmti/getallthreads.h
Normal file
35
libjava/testsuite/libjava.jvmti/getallthreads.h
Normal file
@ -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__ */
|
BIN
libjava/testsuite/libjava.jvmti/getallthreads.jar
Normal file
BIN
libjava/testsuite/libjava.jvmti/getallthreads.jar
Normal file
Binary file not shown.
80
libjava/testsuite/libjava.jvmti/getallthreads.java
Normal file
80
libjava/testsuite/libjava.jvmti/getallthreads.java
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
23
libjava/testsuite/libjava.jvmti/getallthreads.out
Normal file
23
libjava/testsuite/libjava.jvmti/getallthreads.out
Normal file
@ -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
|
55
libjava/testsuite/libjava.jvmti/natgetallthreads.cc
Normal file
55
libjava/testsuite/libjava.jvmti/natgetallthreads.cc
Normal file
@ -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
Block a user