From 34b0e09cd2ed4f463f7168b8ca0fb8f15443d455 Mon Sep 17 00:00:00 2001 From: kgallowa Date: Tue, 16 Jan 2007 15:06:28 +0000 Subject: [PATCH] 2007-01-16 Kyle Galloway * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@120827 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 9 ++ libjava/jvmti.cc | 49 ++++++++++- .../testsuite/libjava.jvmti/getallthreads.h | 35 ++++++++ .../testsuite/libjava.jvmti/getallthreads.jar | Bin 0 -> 1228 bytes .../libjava.jvmti/getallthreads.java | 80 ++++++++++++++++++ .../testsuite/libjava.jvmti/getallthreads.out | 23 +++++ .../libjava.jvmti/natgetallthreads.cc | 55 ++++++++++++ 7 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 libjava/testsuite/libjava.jvmti/getallthreads.h create mode 100644 libjava/testsuite/libjava.jvmti/getallthreads.jar create mode 100644 libjava/testsuite/libjava.jvmti/getallthreads.java create mode 100644 libjava/testsuite/libjava.jvmti/getallthreads.out create mode 100644 libjava/testsuite/libjava.jvmti/natgetallthreads.cc diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 0c4b13ae6ec7..af8efa013836 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,12 @@ +2007-01-16 Kyle Galloway + + * 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 * gnu/classpath/jdwp/natVMVirtualMachine.cc (suspendThread): Use diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc index 8584c333d6d1..b9646b7d1018 100644 --- a/libjava/jvmti.cc +++ b/libjava/jvmti.cc @@ -28,7 +28,9 @@ details. */ #include #include #include +#include #include +#include #include #include #include @@ -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 *thr_arr; + + // Allocate some extra space since threads can be created between calls + try + { + thr_arr + = reinterpret_cast *> (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 (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 diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.h b/libjava/testsuite/libjava.jvmti/getallthreads.h new file mode 100644 index 000000000000..7579892f3f7b --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/getallthreads.h @@ -0,0 +1,35 @@ +// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*- + +#ifndef __getallthreads__ +#define __getallthreads__ + +#pragma interface + +#include +#include + +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__ */ diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.jar b/libjava/testsuite/libjava.jvmti/getallthreads.jar new file mode 100644 index 0000000000000000000000000000000000000000..3e59ccdc362c7e302ffb73c948e4c5a20393cb11 GIT binary patch literal 1228 zc-jl_W@h1H00Hl69Ww?bzzM{@t|5-Po_=on0Vv9L=;kKs0NEfcf~?Hf(a+P(H8@1i z*UdLEFEcH*xI{NBwWv5VKhH|RP|twNxhOTUBsE3XsnSZpK+n=hH$6F-iwkBt2ZKA% zbf0MTNH=DnsjLhP!a&jV)RM%UoRSQn)|6tsqsG&0_6T>R|J@w(qXe{wf)&){0*wII)P*RIr^=Vez)A659nG%@vW>%46x)ta`C zZMj=c|Et_RMO+}V@j+daL-sjt{hiCE%9YC0nx>20?Q!tfH>dvDi^`J{`vW(q3d?h{ zwE5mHSVo&ow2 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; + } + } +} diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.out b/libjava/testsuite/libjava.jvmti/getallthreads.out new file mode 100644 index 000000000000..8e05c4a4b625 --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/getallthreads.out @@ -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 diff --git a/libjava/testsuite/libjava.jvmti/natgetallthreads.cc b/libjava/testsuite/libjava.jvmti/natgetallthreads.cc new file mode 100644 index 000000000000..9c4d69cde74a --- /dev/null +++ b/libjava/testsuite/libjava.jvmti/natgetallthreads.cc @@ -0,0 +1,55 @@ +#include + +#include +#include +#include + +#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 (&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 (thread_arr)); + + for (int i = 0; i < num_threads; i++) + printf ("Found thread %d\n", i+1 ); +} + -- 2.47.2