You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@harmony.apache.org by Alexey Varlamov <al...@gmail.com> on 2007/08/29 06:48:17 UTC

Re: svn commit: r570409 - in /harmony/enhanced/drlvm/trunk/src/test/regression/H4511: ./ GCTagged.cpp GCTagged.java run.test.xml

Hi Xiao-Feng,

This test fails on all platforms but Win32, could you please fix or exclude it:

Win64:
    [java]     [junit] Running
org.apache.harmony.drlvm.tests.regression.h4511.GCTagged
     [java]     [junit] Windows reported exception: 0xc0000005
     [java]     [junit] Registers:
     [java]     [junit]     RAX: 0x00000000000000c0, RBX: 0x0000000000130000
     [java]     [junit]     RCX: 0x00000000000000c0, RDX: 0x0000000002f9db00
     [java]     [junit]     RSI: 0x00000000004075da, RDI: 0x000000000012b800
     [java]     [junit]     RSP: 0x000000000012b7e0, RBP: 0x000000000012bbc8
     [java]     [junit]     R8 : 0x0000000002ed66d0, R9 : 0x000000000516ba50
     [java]     [junit]     R10: 0x0000000100000001, R11: 0xffffffff0000ffff
     [java]     [junit]     R12: 0x0000000000000000, R13: 0x0000000000000000
     [java]     [junit]     R14: 0x0000000000000000, R15: 0x0000000000000000
     [java]     [junit]     RIP: 0x0000000000737e38
     [java]     [junit] Stack trace:
     [java]     [junit]   0: ManagedObject::vt (??:-1)
     [java]     [junit]   1: ?? (??:-1)
     [java]     [junit]   2:
org/apache/harmony/nio/FileChannelFactory.getFileChannel(Ljava/lang/Object;JI)Ljava/nio/channels/FileChannel;
(FileChannelFactory.java:38)
     [java]     [junit]   3:
java/io/FileOutputStream.(Ljava/io/FileDescriptor;)V
(FileOutputStream.java:126)
     [java]     [junit]   4:
java/lang/System.createErr()Ljava/io/PrintStream; (System.java:347)
     [java]     [junit]   5: java/lang/System.()V (System.java:59)
     [java]     [junit]   6: ?? (??:-1)
     [java]     [junit]   7: java/lang/ThreadGroup.checkAccess()V
(ThreadGroup.java:180)
     [java]     [junit]   8:
java/lang/ThreadGroup.(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
(ThreadGroup.java:103)
     [java]     [junit]   9:
java/lang/Thread.(Ljava/lang/ThreadGroup;Ljava/lang/String;JJIZ)V
(Thread.java:226)
     [java]     [junit]
     [java]     [junit] Test
org.apache.harmony.drlvm.tests.regression.h4511.GCTagged FAILED

Linux32:
    [java]        [cc]
/export/users/cc/cc-common/build/checkouts/hdk/working_vm/src/test/regression/H4511/GCTagged.cpp:10:
error: integer constant is too large for "long" type

Linux64:
 SIGABRT in VM code.
     [java]     [junit] Stack trace:
     [java]     [junit]   0: raise (??:-1)
     [java]     [junit]   1: abort (??:-1)
     [java]     [junit]   2: ?? (??:-1)
     [java]     [junit]   3: new_do_write (??:-1)
     [java]     [junit]   4: _IO_file_xsputn@@GLIBC_2.2.5 (??:-1)
     [java]     [junit]   5: ?? (??:-1)
     [java]     [junit]   6: ?? (??:-1)
     [java]     [junit]   7: ?? (??:-1)
     [java]     [junit]   8: ?? (??:-1)
     [java]     [junit]   9: ?? (??:-1)
     [java]     [junit]  10: __assert_fail (??:-1)
     [java]     [junit]  11: ?? (??:-1)
     [java]     [junit]  12: ?? (??:-1)
     [java]     [junit]  13: _start (../sysdeps/x86_64/elf/start.S:65)
     [java]     [junit]  14: throw_from_sigcontext
(/export/users/cc/cc-common/build/checkouts/hdk/working_vm/vm/vmcore/src/util/linux/signals_em64t.cpp:166)
     [java]     [junit]  15: ?? (??:-1)
     [java]     [junit]  16:
org/apache/harmony/nio/FileChannelFactory.getFileChannel(Ljava/lang/Object;JI)Ljava/nio/channels/FileChannel;
(FileChannelFactory.java:38)
     [java]     [junit]  17:
java/io/FileOutputStream.(Ljava/io/FileDescriptor;)V
(FileOutputStream.java:126)
     [java]     [junit]  18:
java/lang/System.createErr()Ljava/io/PrintStream; (System.java:347)
     [java]     [junit]  19: java/lang/System.()V (System.java:59)
     [java]     [junit]  20: ?? (??:-1)
     [java]     [junit]  21: java/lang/ThreadGroup.checkAccess()V
(ThreadGroup.java:180)
     [java]     [junit]  22:
java/lang/ThreadGroup.(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
(ThreadGroup.java:103)
     [java]     [junit]  23:
java/lang/Thread.(Ljava/lang/ThreadGroup;Ljava/lang/String;JJIZ)V
(Thread.java:226)

2007/8/28, xli@apache.org <xl...@apache.org>:
> 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
>
>
>

Re: svn commit: r570409 - in /harmony/enhanced/drlvm/trunk/src/test/regression/H4511: ./ GCTagged.cpp GCTagged.java run.test.xml

Posted by Xiao-Feng Li <xi...@gmail.com>.
I rolled it back. I will ask the patch submitter to modify the patch.
Thanks, xiaofeng

On 8/29/07, Alexey Varlamov <al...@gmail.com> wrote:
> Hi Xiao-Feng,
>
> This test fails on all platforms but Win32, could you please fix or exclude it:
>
> Win64:
>     [java]     [junit] Running
> org.apache.harmony.drlvm.tests.regression.h4511.GCTagged
>      [java]     [junit] Windows reported exception: 0xc0000005
>      [java]     [junit] Registers:
>      [java]     [junit]     RAX: 0x00000000000000c0, RBX: 0x0000000000130000
>      [java]     [junit]     RCX: 0x00000000000000c0, RDX: 0x0000000002f9db00
>      [java]     [junit]     RSI: 0x00000000004075da, RDI: 0x000000000012b800
>      [java]     [junit]     RSP: 0x000000000012b7e0, RBP: 0x000000000012bbc8
>      [java]     [junit]     R8 : 0x0000000002ed66d0, R9 : 0x000000000516ba50
>      [java]     [junit]     R10: 0x0000000100000001, R11: 0xffffffff0000ffff
>      [java]     [junit]     R12: 0x0000000000000000, R13: 0x0000000000000000
>      [java]     [junit]     R14: 0x0000000000000000, R15: 0x0000000000000000
>      [java]     [junit]     RIP: 0x0000000000737e38
>      [java]     [junit] Stack trace:
>      [java]     [junit]   0: ManagedObject::vt (??:-1)
>      [java]     [junit]   1: ?? (??:-1)
>      [java]     [junit]   2:
> org/apache/harmony/nio/FileChannelFactory.getFileChannel(Ljava/lang/Object;JI)Ljava/nio/channels/FileChannel;
> (FileChannelFactory.java:38)
>      [java]     [junit]   3:
> java/io/FileOutputStream.(Ljava/io/FileDescriptor;)V
> (FileOutputStream.java:126)
>      [java]     [junit]   4:
> java/lang/System.createErr()Ljava/io/PrintStream; (System.java:347)
>      [java]     [junit]   5: java/lang/System.()V (System.java:59)
>      [java]     [junit]   6: ?? (??:-1)
>      [java]     [junit]   7: java/lang/ThreadGroup.checkAccess()V
> (ThreadGroup.java:180)
>      [java]     [junit]   8:
> java/lang/ThreadGroup.(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
> (ThreadGroup.java:103)
>      [java]     [junit]   9:
> java/lang/Thread.(Ljava/lang/ThreadGroup;Ljava/lang/String;JJIZ)V
> (Thread.java:226)
>      [java]     [junit]
>      [java]     [junit] Test
> org.apache.harmony.drlvm.tests.regression.h4511.GCTagged FAILED
>
> Linux32:
>     [java]        [cc]
> /export/users/cc/cc-common/build/checkouts/hdk/working_vm/src/test/regression/H4511/GCTagged.cpp:10:
> error: integer constant is too large for "long" type
>
> Linux64:
>  SIGABRT in VM code.
>      [java]     [junit] Stack trace:
>      [java]     [junit]   0: raise (??:-1)
>      [java]     [junit]   1: abort (??:-1)
>      [java]     [junit]   2: ?? (??:-1)
>      [java]     [junit]   3: new_do_write (??:-1)
>      [java]     [junit]   4: _IO_file_xsputn@@GLIBC_2.2.5 (??:-1)
>      [java]     [junit]   5: ?? (??:-1)
>      [java]     [junit]   6: ?? (??:-1)
>      [java]     [junit]   7: ?? (??:-1)
>      [java]     [junit]   8: ?? (??:-1)
>      [java]     [junit]   9: ?? (??:-1)
>      [java]     [junit]  10: __assert_fail (??:-1)
>      [java]     [junit]  11: ?? (??:-1)
>      [java]     [junit]  12: ?? (??:-1)
>      [java]     [junit]  13: _start (../sysdeps/x86_64/elf/start.S:65)
>      [java]     [junit]  14: throw_from_sigcontext
> (/export/users/cc/cc-common/build/checkouts/hdk/working_vm/vm/vmcore/src/util/linux/signals_em64t.cpp:166)
>      [java]     [junit]  15: ?? (??:-1)
>      [java]     [junit]  16:
> org/apache/harmony/nio/FileChannelFactory.getFileChannel(Ljava/lang/Object;JI)Ljava/nio/channels/FileChannel;
> (FileChannelFactory.java:38)
>      [java]     [junit]  17:
> java/io/FileOutputStream.(Ljava/io/FileDescriptor;)V
> (FileOutputStream.java:126)
>      [java]     [junit]  18:
> java/lang/System.createErr()Ljava/io/PrintStream; (System.java:347)
>      [java]     [junit]  19: java/lang/System.()V (System.java:59)
>      [java]     [junit]  20: ?? (??:-1)
>      [java]     [junit]  21: java/lang/ThreadGroup.checkAccess()V
> (ThreadGroup.java:180)
>      [java]     [junit]  22:
> java/lang/ThreadGroup.(Ljava/lang/ThreadGroup;Ljava/lang/String;)V
> (ThreadGroup.java:103)
>      [java]     [junit]  23:
> java/lang/Thread.(Ljava/lang/ThreadGroup;Ljava/lang/String;JJIZ)V
> (Thread.java:226)
>
> 2007/8/28, xli@apache.org <xl...@apache.org>:
> > 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
> >
> >
> >
>


-- 
http://xiao-feng.blogspot.com