aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Galloway <kgallowa@redhat.com>2007-01-16 15:06:28 +0000
committerKyle Galloway <kgallowa@gcc.gnu.org>2007-01-16 15:06:28 +0000
commit05794ce850979f99c29d11c470ab8fd33dffd065 (patch)
tree8a3866653315bfe7be70d28bf9d7d4f62e0bdc88
parent878aa8171752ad29ae47099e31fbe3df1dcf3133 (diff)
downloadgcc-05794ce850979f99c29d11c470ab8fd33dffd065.zip
gcc-05794ce850979f99c29d11c470ab8fd33dffd065.tar.gz
gcc-05794ce850979f99c29d11c470ab8fd33dffd065.tar.bz2
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
-rw-r--r--libjava/ChangeLog9
-rw-r--r--libjava/jvmti.cc49
-rw-r--r--libjava/testsuite/libjava.jvmti/getallthreads.h35
-rw-r--r--libjava/testsuite/libjava.jvmti/getallthreads.jarbin0 -> 1228 bytes
-rw-r--r--libjava/testsuite/libjava.jvmti/getallthreads.java80
-rw-r--r--libjava/testsuite/libjava.jvmti/getallthreads.out23
-rw-r--r--libjava/testsuite/libjava.jvmti/natgetallthreads.cc55
7 files changed, 250 insertions, 1 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 0c4b13a..af8efa0 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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
diff --git a/libjava/jvmti.cc b/libjava/jvmti.cc
index 8584c33..b9646b7 100644
--- a/libjava/jvmti.cc
+++ b/libjava/jvmti.cc
@@ -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
diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.h b/libjava/testsuite/libjava.jvmti/getallthreads.h
new file mode 100644
index 0000000..7579892f
--- /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 <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__ */
diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.jar b/libjava/testsuite/libjava.jvmti/getallthreads.jar
new file mode 100644
index 0000000..3e59ccd
--- /dev/null
+++ b/libjava/testsuite/libjava.jvmti/getallthreads.jar
Binary files differ
diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.java b/libjava/testsuite/libjava.jvmti/getallthreads.java
new file mode 100644
index 0000000..00be3a75
--- /dev/null
+++ b/libjava/testsuite/libjava.jvmti/getallthreads.java
@@ -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;
+ }
+ }
+}
diff --git a/libjava/testsuite/libjava.jvmti/getallthreads.out b/libjava/testsuite/libjava.jvmti/getallthreads.out
new file mode 100644
index 0000000..8e05c4a
--- /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 0000000..9c4d69c
--- /dev/null
+++ b/libjava/testsuite/libjava.jvmti/natgetallthreads.cc
@@ -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 );
+}
+