Author: xli
Date: Tue Aug 28 06:10:44 2007
New Revision: 570409
URL: http://svn.apache.org/viewvc?rev=570409&view=rev
Log:
Harmony-4511: test case for tagged object reclamation
Added:
harmony/enhanced/drlvm/trunk/src/test/regression/H4511/
harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp (with props)
harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java (with props)
harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml (with props)
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp?rev=570409&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp Tue Aug 28 06:10:44
2007
@@ -0,0 +1,142 @@
+#include <iostream>
+#include <jvmti.h>
+
+using namespace std;
+
+#define PACKAGE "org/apache/harmony/drlvm/tests/regression/h4511/"
+
+static const char* EXCEPTION_CLASS = "L" PACKAGE "InvokeAgentException;";
+
+static const jlong TAG_VALUE = 0xfedcba9876543210;
+
+#define TURN_EVENT(event, state) { \
+ jvmtiError err = turn_event(jvmti, event, state, #event); \
+ if (JVMTI_ERROR_NONE != err) return; \
+}
+
+#define CHECK_RESULT(func) \
+ if (JVMTI_ERROR_NONE != err) { \
+ cerr << "[JvmtiAgent] ERROR: " << #func << " failed with error:
" << err << endl; \
+ return; \
+ }
+
+#define CHECK_JNI3(result, func, error_code) { \
+ if (jni->ExceptionCheck()) { \
+ cerr << "[JvmtiAgent] ERROR: unexpected exception in " << #func <<
endl; \
+ jni->ExceptionDescribe(); \
+ return error_code; \
+ } \
+ if (! (result)) { \
+ cerr << "[JvmtiAgent] ERROR: get NULL in " << #func << endl; \
+ return error_code; \
+ } \
+}
+
+#define CHECK_JNI(result, func) CHECK_JNI3(result, func, )
+
+static jvmtiError turn_event(jvmtiEnv* jvmti, jvmtiEvent event, bool state,
+ const char* event_name)
+{
+ jvmtiError err;
+ err = jvmti->SetEventNotificationMode(state ? JVMTI_ENABLE : JVMTI_DISABLE,
+ event, NULL);
+ if (JVMTI_ERROR_NONE != err) {
+ cerr << "[JvmtiAgent] ERROR: unable to " << (state ? "en" : "dis")
+ << "able " << event_name
+ << endl;
+ }
+
+ return err;
+}
+
+static void JNICALL VMInit(jvmtiEnv* jvmti, JNIEnv* jni, jthread thread)
+{
+ cerr << endl << "==> VM Init callback" << endl;
+
+ TURN_EVENT(JVMTI_EVENT_EXCEPTION, true);
+}
+
+static void JNICALL
+Exception(jvmtiEnv *jvmti,
+ JNIEnv* jni,
+ jthread thread,
+ jmethodID method,
+ jlocation location,
+ jobject exception,
+ jmethodID catch_method,
+ jlocation catch_location)
+{
+ jvmtiError err;
+
+ jclass exn_class = jni->GetObjectClass(exception);
+ CHECK_JNI(exn_class, GetObjectClass);
+
+ char* class_name = NULL;
+ err = jvmti->GetClassSignature(exn_class, &class_name, NULL);
+ CHECK_RESULT(GetClassSignature);
+
+ if (0 != strcmp(EXCEPTION_CLASS, class_name))
+ return;
+
+// cerr << "==> Exception callback" << endl;
+// cerr << " for class: " << class_name << endl;
+
+ jfieldID object_field = jni->GetFieldID(exn_class, "object",
+ "Ljava/lang/Object;");
+ CHECK_JNI(object_field, GetFieldID);
+
+ jobject object = jni->GetObjectField(exception, object_field);
+ CHECK_JNI(object, GetObjectField);
+
+ err = jvmti->SetTag(object, TAG_VALUE);
+ CHECK_RESULT(SetTag);
+}
+
+JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
+{
+ jvmtiEnv *jvmti = NULL;
+ jvmtiError err;
+
+ // Get JVMTI interface pointer
+ jint iRes = vm->GetEnv((void**)&jvmti, JVMTI_VERSION);
+ if (JNI_OK != iRes) {
+ cerr << "[JvmtiAgent] ERROR: unable to get JVMTI environment" << endl;
+ return -1;
+ }
+
+ // Set events callbacks
+ jvmtiEventCallbacks callbacks;
+ memset(&callbacks, 0, sizeof(jvmtiEventCallbacks));
+
+ callbacks.VMInit = VMInit;
+ callbacks.Exception = Exception;
+
+ err = jvmti->SetEventCallbacks(&callbacks, sizeof(jvmtiEventCallbacks));
+ if (JVMTI_ERROR_NONE != err) {
+ cerr << "[JvmtiAgent] ERROR: unable to register event callbacks" << endl;
+ return -1;
+ }
+
+ err = jvmti->SetEventNotificationMode(JVMTI_ENABLE,
+ JVMTI_EVENT_VM_INIT, NULL);
+ if (JVMTI_ERROR_NONE != err) {
+ cerr << "[JvmtiAgent] ERROR: unable to enable VMInit event"
+ << endl;
+ return -1;
+ }
+
+ // Set capabilities
+ jvmtiCapabilities capabilities;
+ memset(&capabilities, 0, sizeof(jvmtiCapabilities));
+ capabilities.can_generate_exception_events = 1;
+ capabilities.can_tag_objects = 1;
+
+ err = jvmti->AddCapabilities(&capabilities);
+ if (JVMTI_ERROR_NONE != err) {
+ cerr << "[JvmtiAgent] ERROR: unable to possess capabilities" << endl;
+ return -1;
+ }
+
+ // Agent initialized successfully
+ return 0;
+}
Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java?rev=570409&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java Tue Aug 28 06:10:44
2007
@@ -0,0 +1,60 @@
+package org.apache.harmony.drlvm.tests.regression.h4511;
+
+import junit.framework.TestCase;
+
+/**
+ * Test case for garbage collectin of tagged objects.
+ */
+public class GCTagged extends TestCase {
+
+ static final int OBJECT_NUMBER = 1000;
+ static final int OBJECT_SIZE = 1024 * 1024;
+
+ public static void main(String args[]) {
+ (new GCTagged()).test();
+ }
+
+ public void test() {
+
+ System.out.println("Allocating " + OBJECT_NUMBER +
+ " byte arrays of size " + OBJECT_SIZE);
+ int a = 0;
+ int i = 0;
+ OutOfMemoryError exception = null;
+
+ try {
+ for (; i < OBJECT_NUMBER; i++) {
+
+ Object obj = new byte[OBJECT_SIZE];
+ try {
+ // notify agent to set the tag
+ throw new InvokeAgentException(obj);
+ } catch (InvokeAgentException exc) {
+ // useless code just to prevent optimizing jit from
+ // eliminating emty catch block
+ a += obj.hashCode();
+ }
+ }
+
+ System.out.println("done.");
+ } catch (OutOfMemoryError exc) {
+ exception = exc;
+
+ System.out.println("Caught " + exc);
+ System.out.println(" at iteration " + i);
+ System.out.println(" approx alocated size (bytes) " +
+ i * OBJECT_SIZE);
+ }
+
+ assertTrue(null == exception);
+ }
+}
+
+class InvokeAgentException extends Exception {
+
+ Object object;
+
+ InvokeAgentException(Object obj) {
+ this.object = obj;
+ }
+}
Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml?rev=570409&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml Tue Aug 28 06:10:44
2007
@@ -0,0 +1,9 @@
+<project name="RUN HARMONY-4511 Regression Test">
+ <target name="run-test">
+ <!-- use special launcher for JVMTI tests -->
+ <run-jvmti-test
+ test="org.apache.harmony.drlvm.tests.regression.h4511.GCTagged"
+ agent="GCTagged"/>
+ </target>
+</project>
+
Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml
------------------------------------------------------------------------------
svn:eol-style = native
|