Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 70031 invoked from network); 30 Aug 2007 13:38:03 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 30 Aug 2007 13:38:02 -0000 Received: (qmail 11479 invoked by uid 500); 30 Aug 2007 13:37:46 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 10870 invoked by uid 500); 30 Aug 2007 13:37:45 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 10849 invoked by uid 99); 30 Aug 2007 13:37:45 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 30 Aug 2007 06:37:45 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 30 Aug 2007 13:38:48 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 4622D1A9832; Thu, 30 Aug 2007 06:37:26 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit 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 -0000 To: commits@harmony.apache.org From: xli@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20070830133726.4622D1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 +#include + +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 @@ + + + + + + + Propchange: harmony/enhanced/drlvm/trunk/src/test/regression/H4511/run.test.xml ------------------------------------------------------------------------------ svn:eol-style = native