harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From x..@apache.org
Subject svn commit: r571167 - in /harmony/enhanced/drlvm/trunk/src/test/regression/H4511: GCTagged.cpp GCTagged.java run.test.xml
Date Thu, 30 Aug 2007 13:37:25 GMT
Author: xli
Date: Thu Aug 30 06:37:25 2007
New Revision: 571167

URL: http://svn.apache.org/viewvc?rev=571167&view=rev
Log:
Harmony-4511: test case for tagged object reclamation

Added:
    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=571167&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.cpp Thu Aug 30 06:37:25
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 = 0xfedcba9876543210LL;
+
+#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=571167&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H4511/GCTagged.java Thu Aug 30 06:37:25
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=571167&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 Thu Aug 30 06:37:25
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



Mime
View raw message