Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 38371 invoked from network); 21 Nov 2007 16:30:54 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 21 Nov 2007 16:30:54 -0000 Received: (qmail 45371 invoked by uid 500); 21 Nov 2007 16:30:42 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 45354 invoked by uid 500); 21 Nov 2007 16:30:42 -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 45342 invoked by uid 99); 21 Nov 2007 16:30:41 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 21 Nov 2007 08:30:41 -0800 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; Wed, 21 Nov 2007 16:30:38 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E141E1A9842; Wed, 21 Nov 2007 08:30:31 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r597138 [3/15] - in /harmony/enhanced/drlvm/trunk: build/make/ build/make/components/vm/ vm/include/ vm/include/open/ vm/jitrino/src/codegenerator/ia32/ vm/port/src/encoder/ia32_em64t/ vm/port/src/lil/ia32/pim/ vm/tests/ncai/ vm/tests/ncai/... Date: Wed, 21 Nov 2007 16:29:54 -0000 To: commits@harmony.apache.org From: gshimansky@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071121163031.E141E1A9842@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount01n/GetFrameCount01n.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount01n/GetFrameCount01n.java?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount01n/GetFrameCount01n.java (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount01n/GetFrameCount01n.java Wed Nov 21 08:29:40 2007 @@ -0,0 +1,90 @@ +package ncai.funcs; + +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ +public class GetFrameCount01n extends Thread{ + public native void TestFunction(); + public native void TestFunction1(); + public static native boolean stopsignal(); + public static native void resumeagent(); + + static boolean NoLibrary = false; + static { + try{ + System.loadLibrary("GetFrameCount01n"); + } + catch(Throwable e){ + NoLibrary = true; + } + } + + GetFrameCount01n(String name) + { + super(name); + } + + static public void main(String args[]) { + if(NoLibrary) return; + new GetFrameCount01n("java_thread").start(); + special_method(); + /* + while(!stopsignal()){ + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + System.out.println("\tJAVA: main: ..."); + } + + try { + sleep(1000, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + + System.out.println("\tJAVA: main - exit"); + +*/ + return; + } + + public void test_java_func1(){ + System.out.println("thread - java func1\n"); + TestFunction(); + } + + public void test_java_func2(){ + System.out.println("thread - java func2\n"); + test_java_func3(); + } + + public void test_java_func3(){ + System.out.println("thread - java func3\n"); + TestFunction1(); + resumeagent(); /* + while(!stopsignal()) + { + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + //System.out.println("\tJAVA: Thread: ..."); + }*/ + } + + static public void special_method() { + /* + * Transfer control to native part. + */ + try { + throw new InterruptedException(); + } catch (Throwable tex) { } + return; + } + + public void run() { + System.out.println("thread - java run\n"); + test_java_func1(); + } +} + + Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount01n/GetFrameCount01n.java ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.cpp?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.cpp Wed Nov 21 08:29:40 2007 @@ -0,0 +1,400 @@ +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ + +/* *********************************************************************** */ + +#include "events.h" +#include "utils.h" +#include "ncai.h" + +#ifdef POSIX +#include +#include +#else +#include +#include +#endif + +#ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) { timespec delay = {(_x_)/1000, 1000000*((_x_)%1000)}; nanosleep(&delay, NULL); } +#else // #ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) Sleep((_x_)) +#endif // #ifdef POSIX + +static int g_stop_thread = 0; +static int g_resume_agent_thread = 0; +static jthread g_thread_jthread; +//static jthread g_agent_thread; + +static volatile int no_opt = 1; //used to prevent inlining; + +static bool test = false; +static bool util = false; +static bool flag = false; + +const char test_case_name[] = "GetFrameCount02n"; + +static void Test1(JNIEnv *env, jobject obj); +static void Test2(JNIEnv *env, jobject obj); +static void Test3(JNIEnv *env, jobject obj); +//static void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*); +static bool CheckFrames(ncaiEnv*, ncaiThread, ncaiFrameInfo**, jint*); + +extern "C" JNIEXPORT void JNICALL +Java_ncai_funcs_GetFrameCount02n_resumeagent(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + g_resume_agent_thread = 1; +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_ncai_funcs_GetFrameCount02n_stopsignal(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + return g_stop_thread ? true : false; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount02n_TestFunction + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction\n"); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetMethodID(clazz, "test_java_func2", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction: GetStaticMethodID for 'test_java_func2' failed\n"); + return; + } + env->CallVoidMethod(obj, mid); + return; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount02n_TestFunction1 + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction1\n"); + Test1(env, obj); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1;/* + while(g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + }*/ + + return; +} + +void JNICALL ThreadStart(jvmtiEnv *jvmti_env, + JNIEnv* jni_env, + jthread thread) +{ + jvmtiPhase phase; + jvmtiError result; + jvmtiThreadInfo tinfo; + + result = jvmti_env->GetPhase(&phase); + if (result != JVMTI_ERROR_NONE || phase != JVMTI_PHASE_LIVE) + return; + + result = jvmti_env->GetThreadInfo(thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + return; + + if (strcmp(tinfo.name, "java_thread") != 0) + return; + + printf("ThreadStart: java_thread\n"); + g_thread_jthread = jni_env->NewGlobalRef(thread); +/* + jclass clazz = jni_env->FindClass("java/lang/Thread"); + if (!clazz) + { + fprintf(stderr, "\tnative: JNI: FindClass failed\n"); + return; + } + + jmethodID mid = jni_env->GetMethodID(clazz, "", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: JNI: GetMethodID failed\n"); + return; + } + + g_agent_thread = jni_env->NewObject(clazz, mid, "native_agent_thread"); + if (!g_agent_thread) + { + fprintf(stderr, "\tnative: JNI: NewObject failed\n"); + return; + } + + g_agent_thread = jni_env->NewGlobalRef(g_agent_thread); + result = jvmti_env->GetThreadInfo(g_agent_thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: JNI: GetThreadInfo failed\n"); + } + + result = jvmti_env->RunAgentThread(g_agent_thread, test_function, NULL, JVMTI_THREAD_NORM_PRIORITY); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: jvmti: RunAgentThread failed\n"); + return; + }*/ +} +/* +JNIEXPORT jint +JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) +{ + jint res; + jvmtiEnv* jvmti_env = NULL; + + res = jvm->GetEnv((void**)&jvmti_env, JVMTI_VERSION_1_0); + if (res != JNI_OK || jvmti_env == NULL) + return JNI_ERR; + + jvmtiEventCallbacks callbacks; + callbacks.ThreadStart=&ThreadStart; + + jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); + jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL); + + return JNI_OK; +} +*/ +/* *********************************************************************** */ + +JNIEXPORT jint JNICALL Agent_OnLoad(prms_AGENT_ONLOAD) +{ + + Callbacks CB; + CB.cbThreadStart = &ThreadStart; + check_AGENT_ONLOAD; + jvmtiEvent events[] = { JVMTI_EVENT_EXCEPTION, JVMTI_EVENT_THREAD_START, JVMTI_EVENT_VM_DEATH }; + cb_exc; + cb_death; + return func_for_Agent_OnLoad(vm, options, reserved, &CB, + events, sizeof(events)/sizeof(jvmtiEvent), test_case_name, DEBUG_OUT); +} + +/* *********************************************************************** */ + +void JNICALL callbackException(jvmtiEnv *jvmti_env, JNIEnv* jni_env, + jthread thread, jmethodID method, + jlocation location, jobject exception, + jmethodID catch_method, jlocation catch_location) +{ + check_EXCPT; + if (flag) return; + + /* + * Function separate all other exceptions in all other method + */ + if (!check_phase_and_method_debug(jvmti_env, method, SPP_LIVE_ONLY, + "special_method", DEBUG_OUT)) return; + + flag = true; + util = true; + + fprintf(stderr, "agent... \n"); + SLEEP_UNIVERSAL(300); + ////////////////////ncai env get + jvmtiError err; + ncaiError ncai_err; + + jvmtiExtensionFunctionInfo* ext_info = NULL; + jint ext_count = 0; + + err = jvmti_env->GetExtensionFunctions(&ext_count, &ext_info); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + fprintf(stderr, "agent... \n"); + if (ext_count == 0 || ext_info == NULL) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned no extensions\n"); + test = false; + return; + } + + jvmtiExtensionFunction get_ncai_func = NULL; + + fprintf(stderr, "agent... \n"); + for (int k = 0; k < ext_count; k++) + { + if (strcmp(ext_info[k].id, "org.apache.harmony.vm.GetExtensionEnv") == 0) + { + get_ncai_func = ext_info[k].func; + break; + } + } + + fprintf(stderr, "agent... \n"); + if (get_ncai_func == NULL) + { + fprintf(stderr, "test_function: GetNCAIEnvironment() nas not been found among JVMTI extensions\n"); + test = false; + return; + } + + ncaiEnv* ncai_env = NULL; + + fprintf(stderr, "agent... \n"); + err = get_ncai_func(jvmti_env, &ncai_env, NCAI_VERSION_1_0); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: get_ncai_func() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + if (ncai_env == NULL) + { + fprintf(stderr, "test_function: get_ncai_func() returned NULL environment\n"); + test = false; + return; + } + fprintf(stderr, "agent... \n"); + /////////////////////////////////// + ncaiThread ncai_thread; + + fprintf(stderr, "calling ncai->GetThreadHandle()...\n"); + ncai_err = ncai_env->GetThreadHandle(g_thread_jthread, &ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetThreadHandle() returned error: %d", ncai_err); + test = false; + return; + } + + ncaiFrameInfo* frames; + jint frames_returned; + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + g_stop_thread = 1; + SLEEP_UNIVERSAL(5000); + + test = CheckFrames(ncai_env, ncai_thread, &frames, &frames_returned); +} + +void JNICALL callbackVMDeath(prms_VMDEATH) +{ + check_VMDEATH; + func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util); +} + +/* *********************************************************************** */ + +void Test1(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test1(env, obj); + + fprintf(stderr, "thread - pure native Test1\n"); + return Test2(env, obj); +} + +void Test2(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test2(env, obj); + + fprintf(stderr, "thread - pure native Test2\n"); + return Test3(env, obj); +} + +void Test3(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test3(env, obj); + + fprintf(stderr, "thread - pure native Test3\n"); + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1; + while(!g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + } + + return; +} + +bool CheckFrames(ncaiEnv *ncai_env, ncaiThread ncai_thread, ncaiFrameInfo** ret_frames, jint* ret_count) +{ + //warning fix + int w_fix = sizeof(ret_frames); + w_fix += sizeof(ret_count); + // + + ncaiError ncai_err; + jint frame_count = 100; + + fprintf(stderr, "calling ncai->GetFrameCount()...\n"); + ncai_err = ncai_env->GetFrameCount(ncai_thread, &frame_count); + if (ncai_err == NCAI_ERROR_THREAD_NOT_ALIVE) + { + return true; + } + + fprintf(stderr, "ncai->GetFrameCount() incorrectly returned code %d\n", ncai_err); + return false; +} Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.cpp ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.java?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.java (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.java Wed Nov 21 08:29:40 2007 @@ -0,0 +1,90 @@ +package ncai.funcs; + +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ +public class GetFrameCount02n extends Thread{ + public native void TestFunction(); + public native void TestFunction1(); + public static native boolean stopsignal(); + public static native void resumeagent(); + + static boolean NoLibrary = false; + static { + try{ + System.loadLibrary("GetFrameCount02n"); + } + catch(Throwable e){ + NoLibrary = true; + } + } + + GetFrameCount02n(String name) + { + super(name); + } + + static public void main(String args[]) { + if(NoLibrary) return; + new GetFrameCount02n("java_thread").start(); + special_method(); + /* + while(!stopsignal()){ + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + System.out.println("\tJAVA: main: ..."); + } + + try { + sleep(1000, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + + System.out.println("\tJAVA: main - exit"); + +*/ + return; + } + + public void test_java_func1(){ + System.out.println("thread - java func1\n"); + TestFunction(); + } + + public void test_java_func2(){ + System.out.println("thread - java func2\n"); + test_java_func3(); + } + + public void test_java_func3(){ + System.out.println("thread - java func3\n"); + TestFunction1(); + resumeagent(); /* + while(!stopsignal()) + { + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + //System.out.println("\tJAVA: Thread: ..."); + }*/ + } + + static public void special_method() { + /* + * Transfer control to native part. + */ + try { + throw new InterruptedException(); + } catch (Throwable tex) { } + return; + } + + public void run() { + System.out.println("thread - java run\n"); + test_java_func1(); + } +} + + Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount02n/GetFrameCount02n.java ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.cpp?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.cpp Wed Nov 21 08:29:40 2007 @@ -0,0 +1,427 @@ +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ + +/* *********************************************************************** */ + +#include "events.h" +#include "utils.h" +#include "ncai.h" + +#ifdef POSIX +#include +#include +#else +#include +#include +#endif + +#ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) { timespec delay = {(_x_)/1000, 1000000*((_x_)%1000)}; nanosleep(&delay, NULL); } +#else // #ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) Sleep((_x_)) +#endif // #ifdef POSIX + +static int g_stop_thread = 0; +static int g_resume_agent_thread = 0; +static jthread g_thread_jthread; +//static jthread g_agent_thread; + +static volatile int no_opt = 1; //used to prevent inlining; + +static bool test = false; +static bool util = false; +static bool flag = false; + +const char test_case_name[] = "GetFrameCount02"; + +static void Test1(JNIEnv *env, jobject obj); +static void Test2(JNIEnv *env, jobject obj); +static void Test3(JNIEnv *env, jobject obj); +//static void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*); +static bool CheckFrames(ncaiEnv*, ncaiThread, ncaiFrameInfo**, jint*); + +extern "C" JNIEXPORT jboolean JNICALL +Java_ncai_funcs_GetFrameCount02_stopsignal(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + return g_stop_thread ? true : false; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount03_TestFunction + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction\n"); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetMethodID(clazz, "TestFunction1", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction: GetStaticMethodID for 'test_java_func2' failed\n"); + return; + } + env->CallVoidMethod(obj, mid); + return; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount03_TestFunction1 + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction1\n"); + Test1(env, obj); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1; + while(g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + } + + return; +} + +void JNICALL ThreadStart(jvmtiEnv *jvmti_env, + JNIEnv* jni_env, + jthread thread) +{ + jvmtiPhase phase; + jvmtiError result; + jvmtiThreadInfo tinfo; + + result = jvmti_env->GetPhase(&phase); + if (result != JVMTI_ERROR_NONE || phase != JVMTI_PHASE_LIVE) + return; + + result = jvmti_env->GetThreadInfo(thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + return; + + if (strcmp(tinfo.name, "java_thread") != 0) + return; + + printf("ThreadStart: java_thread\n"); + g_thread_jthread = jni_env->NewGlobalRef(thread); +/* + jclass clazz = jni_env->FindClass("java/lang/Thread"); + if (!clazz) + { + fprintf(stderr, "\tnative: JNI: FindClass failed\n"); + return; + } + + jmethodID mid = jni_env->GetMethodID(clazz, "", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: JNI: GetMethodID failed\n"); + return; + } + + g_agent_thread = jni_env->NewObject(clazz, mid, "native_agent_thread"); + if (!g_agent_thread) + { + fprintf(stderr, "\tnative: JNI: NewObject failed\n"); + return; + } + + g_agent_thread = jni_env->NewGlobalRef(g_agent_thread); + result = jvmti_env->GetThreadInfo(g_agent_thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: JNI: GetThreadInfo failed\n"); + } + + result = jvmti_env->RunAgentThread(g_agent_thread, test_function, NULL, JVMTI_THREAD_NORM_PRIORITY); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: jvmti: RunAgentThread failed\n"); + return; + }*/ +} +/* +JNIEXPORT jint +JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) +{ + jint res; + jvmtiEnv* jvmti_env = NULL; + + res = jvm->GetEnv((void**)&jvmti_env, JVMTI_VERSION_1_0); + if (res != JNI_OK || jvmti_env == NULL) + return JNI_ERR; + + jvmtiEventCallbacks callbacks; + callbacks.ThreadStart=&ThreadStart; + + jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); + jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL); + + return JNI_OK; +} +*/ +/* *********************************************************************** */ + +JNIEXPORT jint JNICALL Agent_OnLoad(prms_AGENT_ONLOAD) +{ + + Callbacks CB; + CB.cbThreadStart = &ThreadStart; + check_AGENT_ONLOAD; + jvmtiEvent events[] = { JVMTI_EVENT_EXCEPTION, JVMTI_EVENT_THREAD_START, JVMTI_EVENT_VM_DEATH }; + cb_exc; + cb_death; + return func_for_Agent_OnLoad(vm, options, reserved, &CB, + events, sizeof(events)/sizeof(jvmtiEvent), test_case_name, DEBUG_OUT); +} + +/* *********************************************************************** */ + +void JNICALL callbackException(jvmtiEnv *jvmti_env, JNIEnv* jni_env, + jthread thread, jmethodID method, + jlocation location, jobject exception, + jmethodID catch_method, jlocation catch_location) +{ + check_EXCPT; + if (flag) return; + + /* + * Function separate all other exceptions in all other method + */ + if (!check_phase_and_method_debug(jvmti_env, method, SPP_LIVE_ONLY, + "special_method", DEBUG_OUT)) return; + + flag = true; + util = true; + + fprintf(stderr, "agent... \n"); + SLEEP_UNIVERSAL(300); + ////////////////////ncai env get + jvmtiError err; + ncaiError ncai_err; + + jvmtiExtensionFunctionInfo* ext_info = NULL; + jint ext_count = 0; + + err = jvmti_env->GetExtensionFunctions(&ext_count, &ext_info); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + fprintf(stderr, "agent... \n"); + if (ext_count == 0 || ext_info == NULL) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned no extensions\n"); + test = false; + return; + } + + jvmtiExtensionFunction get_ncai_func = NULL; + + fprintf(stderr, "agent... \n"); + for (int k = 0; k < ext_count; k++) + { + if (strcmp(ext_info[k].id, "org.apache.harmony.vm.GetExtensionEnv") == 0) + { + get_ncai_func = ext_info[k].func; + break; + } + } + + fprintf(stderr, "agent... \n"); + if (get_ncai_func == NULL) + { + fprintf(stderr, "test_function: GetNCAIEnvironment() nas not been found among JVMTI extensions\n"); + test = false; + return; + } + + ncaiEnv* ncai_env = NULL; + + fprintf(stderr, "agent... \n"); + err = get_ncai_func(jvmti_env, &ncai_env, NCAI_VERSION_1_0); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: get_ncai_func() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + if (ncai_env == NULL) + { + fprintf(stderr, "test_function: get_ncai_func() returned NULL environment\n"); + test = false; + return; + } + fprintf(stderr, "agent... \n"); + /////////////////////////////////// + SLEEP_UNIVERSAL(500); + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + ncaiThread ncai_thread; + + fprintf(stderr, "calling ncai->GetThreadHandle()...\n"); + ncai_err = ncai_env->GetThreadHandle(g_thread_jthread, &ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetThreadHandle() returned error: %d", ncai_err); + test = false; + return; + } + + ncaiFrameInfo* frames1; + ncaiFrameInfo* frames2; + jint frames_returned1, frames_returned2; + + test = CheckFrames(ncai_env, ncai_thread, &frames1, &frames_returned1); + + g_stop_thread = 1; + SLEEP_UNIVERSAL(500); + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + test = test && CheckFrames(ncai_env, ncai_thread, &frames2, &frames_returned2); + + if (frames_returned1 - frames_returned2 != 3) + { + fprintf(stderr, "\nincorrect frames count\n"); + test = false; + g_stop_thread = 0; + return; + } + + g_stop_thread = 0; + +} + +void JNICALL callbackVMDeath(prms_VMDEATH) +{ + check_VMDEATH; + func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util); +} + +/* *********************************************************************** */ + +void Test1(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test1(env, obj); + + fprintf(stderr, "thread - pure native Test1\n"); + return Test2(env, obj); +} + +void Test2(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test2(env, obj); + + fprintf(stderr, "thread - pure native Test2\n"); + return Test3(env, obj); +} + +void Test3(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test3(env, obj); + + fprintf(stderr, "thread - pure native Test3\n"); + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1; + while(!g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + } + + return; +} + +bool CheckFrames(ncaiEnv *ncai_env, ncaiThread ncai_thread, ncaiFrameInfo** ret_frames, jint* ret_count) +{ + //warning fix + int w_fix = sizeof(ret_frames); + w_fix += 3; + // + + fprintf(stderr, "agent... suspend thread \n"); + ncaiError ncai_err = ncai_env->SuspendThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->SuspendThread() returned error: %d,\n", ncai_err); + return false; + } + + jint frame_count; + fprintf(stderr, "calling ncai->GetFrameCount()...\n"); + ncai_err = ncai_env->GetFrameCount(ncai_thread, &frame_count); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetFrameCount() returned error: %d,\n", ncai_err); + return false; + } + + fprintf(stderr, "test_function: frame count = %d\n", frame_count); + + fprintf(stderr, "agent... resuming thread \n"); + ncai_env->ResumeThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->SuspendThread() returned error: %d,\n", ncai_err); + return false; + } + + *ret_count = frame_count; + + return true; +} Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.cpp ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.java?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.java (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.java Wed Nov 21 08:29:40 2007 @@ -0,0 +1,51 @@ +package ncai.funcs; + +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ +public class GetFrameCount03 extends Thread{ + public native void TestFunction(); + public native void TestFunction1(); + public static native boolean stopsignal(); + + static boolean NoLibrary = false; + static { + try{ + System.loadLibrary("GetFrameCount03"); + } + catch(Throwable e){ + NoLibrary = true; + } + } + + GetFrameCount03(String name) + { + super(name); + } + + static public void main(String args[]) { + if(NoLibrary) return; + new GetFrameCount03("java_thread").start(); + special_method(); + return; + } + + static public void special_method() { + /* + * Transfer control to native part. + */ + try { + throw new InterruptedException(); + } catch (Throwable tex) { } + return; + } + + public void run() { + System.out.println("thread - java run\n"); + TestFunction(); + } +} + + Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03/GetFrameCount03.java ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.cpp?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.cpp Wed Nov 21 08:29:40 2007 @@ -0,0 +1,427 @@ +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ + +/* *********************************************************************** */ + +#include "events.h" +#include "utils.h" +#include "ncai.h" + +#ifdef POSIX +#include +#include +#else +#include +#include +#endif + +#ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) { timespec delay = {(_x_)/1000, 1000000*((_x_)%1000)}; nanosleep(&delay, NULL); } +#else // #ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) Sleep((_x_)) +#endif // #ifdef POSIX + +static int g_stop_thread = 0; +static int g_resume_agent_thread = 0; +static jthread g_thread_jthread; +//static jthread g_agent_thread; + +static volatile int no_opt = 1; //used to prevent inlining; + +static bool test = false; +static bool util = false; +static bool flag = false; + +const char test_case_name[] = "GetFrameCount03n"; + +static void Test1(JNIEnv *env, jobject obj); +static void Test2(JNIEnv *env, jobject obj); +static void Test3(JNIEnv *env, jobject obj); +//static void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*); +static bool CheckFrames(ncaiEnv*, ncaiThread, ncaiFrameInfo**, jint*); + +extern "C" JNIEXPORT void JNICALL +Java_ncai_funcs_GetFrameCount03n_resumeagent(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + g_resume_agent_thread = 1; +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_ncai_funcs_GetFrameCount03n_stopsignal(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + return g_stop_thread ? true : false; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount03n_TestFunction + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction\n"); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetMethodID(clazz, "test_java_func2", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction: GetStaticMethodID for 'test_java_func2' failed\n"); + return; + } + env->CallVoidMethod(obj, mid); + return; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount03n_TestFunction1 + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction1\n"); + Test1(env, obj); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1;/* + while(g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + }*/ + + return; +} + +void JNICALL ThreadStart(jvmtiEnv *jvmti_env, + JNIEnv* jni_env, + jthread thread) +{ + jvmtiPhase phase; + jvmtiError result; + jvmtiThreadInfo tinfo; + + result = jvmti_env->GetPhase(&phase); + if (result != JVMTI_ERROR_NONE || phase != JVMTI_PHASE_LIVE) + return; + + result = jvmti_env->GetThreadInfo(thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + return; + + if (strcmp(tinfo.name, "java_thread") != 0) + return; + + printf("ThreadStart: java_thread\n"); + g_thread_jthread = jni_env->NewGlobalRef(thread); +/* + jclass clazz = jni_env->FindClass("java/lang/Thread"); + if (!clazz) + { + fprintf(stderr, "\tnative: JNI: FindClass failed\n"); + return; + } + + jmethodID mid = jni_env->GetMethodID(clazz, "", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: JNI: GetMethodID failed\n"); + return; + } + + g_agent_thread = jni_env->NewObject(clazz, mid, "native_agent_thread"); + if (!g_agent_thread) + { + fprintf(stderr, "\tnative: JNI: NewObject failed\n"); + return; + } + + g_agent_thread = jni_env->NewGlobalRef(g_agent_thread); + result = jvmti_env->GetThreadInfo(g_agent_thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: JNI: GetThreadInfo failed\n"); + } + + result = jvmti_env->RunAgentThread(g_agent_thread, test_function, NULL, JVMTI_THREAD_NORM_PRIORITY); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: jvmti: RunAgentThread failed\n"); + return; + }*/ +} +/* +JNIEXPORT jint +JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) +{ + jint res; + jvmtiEnv* jvmti_env = NULL; + + res = jvm->GetEnv((void**)&jvmti_env, JVMTI_VERSION_1_0); + if (res != JNI_OK || jvmti_env == NULL) + return JNI_ERR; + + jvmtiEventCallbacks callbacks; + callbacks.ThreadStart=&ThreadStart; + + jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); + jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL); + + return JNI_OK; +} +*/ +/* *********************************************************************** */ + +JNIEXPORT jint JNICALL Agent_OnLoad(prms_AGENT_ONLOAD) +{ + + Callbacks CB; + CB.cbThreadStart = &ThreadStart; + check_AGENT_ONLOAD; + jvmtiEvent events[] = { JVMTI_EVENT_EXCEPTION, JVMTI_EVENT_THREAD_START, JVMTI_EVENT_VM_DEATH }; + cb_exc; + cb_death; + return func_for_Agent_OnLoad(vm, options, reserved, &CB, + events, sizeof(events)/sizeof(jvmtiEvent), test_case_name, DEBUG_OUT); +} + +/* *********************************************************************** */ + +void JNICALL callbackException(jvmtiEnv *jvmti_env, JNIEnv* jni_env, + jthread thread, jmethodID method, + jlocation location, jobject exception, + jmethodID catch_method, jlocation catch_location) +{ + check_EXCPT; + if (flag) return; + + /* + * Function separate all other exceptions in all other method + */ + if (!check_phase_and_method_debug(jvmti_env, method, SPP_LIVE_ONLY, + "special_method", DEBUG_OUT)) return; + + flag = true; + util = true; + + fprintf(stderr, "agent... \n"); + SLEEP_UNIVERSAL(300); + ////////////////////ncai env get + jvmtiError err; + ncaiError ncai_err; + + jvmtiExtensionFunctionInfo* ext_info = NULL; + jint ext_count = 0; + + err = jvmti_env->GetExtensionFunctions(&ext_count, &ext_info); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + fprintf(stderr, "agent... \n"); + if (ext_count == 0 || ext_info == NULL) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned no extensions\n"); + test = false; + return; + } + + jvmtiExtensionFunction get_ncai_func = NULL; + + fprintf(stderr, "agent... \n"); + for (int k = 0; k < ext_count; k++) + { + if (strcmp(ext_info[k].id, "org.apache.harmony.vm.GetExtensionEnv") == 0) + { + get_ncai_func = ext_info[k].func; + break; + } + } + + fprintf(stderr, "agent... \n"); + if (get_ncai_func == NULL) + { + fprintf(stderr, "test_function: GetNCAIEnvironment() nas not been found among JVMTI extensions\n"); + test = false; + return; + } + + ncaiEnv* ncai_env = NULL; + + fprintf(stderr, "agent... \n"); + err = get_ncai_func(jvmti_env, &ncai_env, NCAI_VERSION_1_0); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: get_ncai_func() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + if (ncai_env == NULL) + { + fprintf(stderr, "test_function: get_ncai_func() returned NULL environment\n"); + test = false; + return; + } + fprintf(stderr, "agent... \n"); + /////////////////////////////////// + ncaiThread ncai_thread; + + fprintf(stderr, "calling ncai->GetThreadHandle()...\n"); + ncai_err = ncai_env->GetThreadHandle(g_thread_jthread, &ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetThreadHandle() returned error: %d", ncai_err); + test = false; + return; + } + + ncaiFrameInfo* frames; + jint frames_returned; + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + test = CheckFrames(ncai_env, ncai_thread, &frames, &frames_returned); + g_stop_thread = 1; +/* SLEEP_UNIVERSAL(500); + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + g_stop_thread = 0; + SLEEP_UNIVERSAL(500); + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + g_stop_thread = 1; */ +} + +void JNICALL callbackVMDeath(prms_VMDEATH) +{ + check_VMDEATH; + func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util); +} + +/* *********************************************************************** */ + +void Test1(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test1(env, obj); + + fprintf(stderr, "thread - pure native Test1\n"); + return Test2(env, obj); +} + +void Test2(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test2(env, obj); + + fprintf(stderr, "thread - pure native Test2\n"); + return Test3(env, obj); +} + +void Test3(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test3(env, obj); + + fprintf(stderr, "thread - pure native Test3\n"); + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1; + while(!g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + } + + return; +} + +bool CheckFrames(ncaiEnv *ncai_env, ncaiThread ncai_thread, ncaiFrameInfo** ret_frames, jint* ret_count) +{ + bool ret = true; + //warning fix + int w_fix = sizeof(ret_frames); + w_fix += sizeof(ret_count); + // + + fprintf(stderr, "agent... suspend thread \n"); + ncaiError ncai_err = ncai_env->SuspendThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->SuspendThread() returned error: %d,\n", ncai_err); + ret = false; + } + + fprintf(stderr, "calling ncai->GetFrameCount()...\n"); + ncai_err = ncai_env->GetFrameCount(ncai_thread, NULL); + if (ncai_err != NCAI_ERROR_NULL_POINTER) + { + ret = false; + } + + fprintf(stderr, "agent... resuming thread \n"); + ncai_err = ncai_env->ResumeThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->ResumeThread() returned error: %d,\n", ncai_err); + ret = false; + } + + return ret; +} Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.cpp ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.java?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.java (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.java Wed Nov 21 08:29:40 2007 @@ -0,0 +1,90 @@ +package ncai.funcs; + +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ +public class GetFrameCount03n extends Thread{ + public native void TestFunction(); + public native void TestFunction1(); + public static native boolean stopsignal(); + public static native void resumeagent(); + + static boolean NoLibrary = false; + static { + try{ + System.loadLibrary("GetFrameCount03n"); + } + catch(Throwable e){ + NoLibrary = true; + } + } + + GetFrameCount03n(String name) + { + super(name); + } + + static public void main(String args[]) { + if(NoLibrary) return; + new GetFrameCount03n("java_thread").start(); + special_method(); + /* + while(!stopsignal()){ + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + System.out.println("\tJAVA: main: ..."); + } + + try { + sleep(1000, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + + System.out.println("\tJAVA: main - exit"); + +*/ + return; + } + + public void test_java_func1(){ + System.out.println("thread - java func1\n"); + TestFunction(); + } + + public void test_java_func2(){ + System.out.println("thread - java func2\n"); + test_java_func3(); + } + + public void test_java_func3(){ + System.out.println("thread - java func3\n"); + TestFunction1(); + resumeagent(); /* + while(!stopsignal()) + { + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + //System.out.println("\tJAVA: Thread: ..."); + }*/ + } + + static public void special_method() { + /* + * Transfer control to native part. + */ + try { + throw new InterruptedException(); + } catch (Throwable tex) { } + return; + } + + public void run() { + System.out.println("thread - java run\n"); + test_java_func1(); + } +} + + Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount03n/GetFrameCount03n.java ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.cpp?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.cpp Wed Nov 21 08:29:40 2007 @@ -0,0 +1,429 @@ +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ + +/* *********************************************************************** */ + +#include "events.h" +#include "utils.h" +#include "ncai.h" + +#ifdef POSIX +#include +#include +#else +#include +#include +#endif + +#ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) { timespec delay = {(_x_)/1000, 1000000*((_x_)%1000)}; nanosleep(&delay, NULL); } +#else // #ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) Sleep((_x_)) +#endif // #ifdef POSIX + +static int g_stop_thread = 0; +static int g_resume_agent_thread = 0; +static jthread g_thread_jthread; +//static jthread g_agent_thread; + +static volatile int no_opt = 1; //used to prevent inlining; + +static bool test = false; +static bool util = false; +static bool flag = false; + +const char test_case_name[] = "GetFrameCount04n"; + +static void Test1(JNIEnv *env, jobject obj); +static void Test2(JNIEnv *env, jobject obj); +static void Test3(JNIEnv *env, jobject obj); +//static void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*); +static bool CheckFrames(ncaiEnv*, ncaiThread, ncaiFrameInfo**, jint*); + +extern "C" JNIEXPORT void JNICALL +Java_ncai_funcs_GetFrameCount04n_resumeagent(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + g_resume_agent_thread = 1; +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_ncai_funcs_GetFrameCount04n_stopsignal(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + return g_stop_thread ? true : false; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount04n_TestFunction + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction\n"); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetMethodID(clazz, "test_java_func2", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction: GetStaticMethodID for 'test_java_func2' failed\n"); + return; + } + env->CallVoidMethod(obj, mid); + return; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount04n_TestFunction1 + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction1\n"); + Test1(env, obj); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1;/* + while(g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + }*/ + + return; +} + +void JNICALL ThreadStart(jvmtiEnv *jvmti_env, + JNIEnv* jni_env, + jthread thread) +{ + jvmtiPhase phase; + jvmtiError result; + jvmtiThreadInfo tinfo; + + result = jvmti_env->GetPhase(&phase); + if (result != JVMTI_ERROR_NONE || phase != JVMTI_PHASE_LIVE) + return; + + result = jvmti_env->GetThreadInfo(thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + return; + + if (strcmp(tinfo.name, "java_thread") != 0) + return; + + printf("ThreadStart: java_thread\n"); + g_thread_jthread = jni_env->NewGlobalRef(thread); +/* + jclass clazz = jni_env->FindClass("java/lang/Thread"); + if (!clazz) + { + fprintf(stderr, "\tnative: JNI: FindClass failed\n"); + return; + } + + jmethodID mid = jni_env->GetMethodID(clazz, "", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: JNI: GetMethodID failed\n"); + return; + } + + g_agent_thread = jni_env->NewObject(clazz, mid, "native_agent_thread"); + if (!g_agent_thread) + { + fprintf(stderr, "\tnative: JNI: NewObject failed\n"); + return; + } + + g_agent_thread = jni_env->NewGlobalRef(g_agent_thread); + result = jvmti_env->GetThreadInfo(g_agent_thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: JNI: GetThreadInfo failed\n"); + } + + result = jvmti_env->RunAgentThread(g_agent_thread, test_function, NULL, JVMTI_THREAD_NORM_PRIORITY); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: jvmti: RunAgentThread failed\n"); + return; + }*/ +} +/* +JNIEXPORT jint +JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) +{ + jint res; + jvmtiEnv* jvmti_env = NULL; + + res = jvm->GetEnv((void**)&jvmti_env, JVMTI_VERSION_1_0); + if (res != JNI_OK || jvmti_env == NULL) + return JNI_ERR; + + jvmtiEventCallbacks callbacks; + callbacks.ThreadStart=&ThreadStart; + + jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); + jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL); + + return JNI_OK; +} +*/ +/* *********************************************************************** */ + +JNIEXPORT jint JNICALL Agent_OnLoad(prms_AGENT_ONLOAD) +{ + + Callbacks CB; + CB.cbThreadStart = &ThreadStart; + check_AGENT_ONLOAD; + jvmtiEvent events[] = { JVMTI_EVENT_EXCEPTION, JVMTI_EVENT_THREAD_START, JVMTI_EVENT_VM_DEATH }; + cb_exc; + cb_death; + return func_for_Agent_OnLoad(vm, options, reserved, &CB, + events, sizeof(events)/sizeof(jvmtiEvent), test_case_name, DEBUG_OUT); +} + +/* *********************************************************************** */ + +void JNICALL callbackException(jvmtiEnv *jvmti_env, JNIEnv* jni_env, + jthread thread, jmethodID method, + jlocation location, jobject exception, + jmethodID catch_method, jlocation catch_location) +{ + check_EXCPT; + if (flag) return; + + /* + * Function separate all other exceptions in all other method + */ + if (!check_phase_and_method_debug(jvmti_env, method, SPP_LIVE_ONLY, + "special_method", DEBUG_OUT)) return; + + flag = true; + util = true; + + fprintf(stderr, "agent... \n"); + SLEEP_UNIVERSAL(300); + ////////////////////ncai env get + jvmtiError err; + ncaiError ncai_err; + + jvmtiExtensionFunctionInfo* ext_info = NULL; + jint ext_count = 0; + + err = jvmti_env->GetExtensionFunctions(&ext_count, &ext_info); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + fprintf(stderr, "agent... \n"); + if (ext_count == 0 || ext_info == NULL) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned no extensions\n"); + test = false; + return; + } + + jvmtiExtensionFunction get_ncai_func = NULL; + + fprintf(stderr, "agent... \n"); + for (int k = 0; k < ext_count; k++) + { + if (strcmp(ext_info[k].id, "org.apache.harmony.vm.GetExtensionEnv") == 0) + { + get_ncai_func = ext_info[k].func; + break; + } + } + + fprintf(stderr, "agent... \n"); + if (get_ncai_func == NULL) + { + fprintf(stderr, "test_function: GetNCAIEnvironment() nas not been found among JVMTI extensions\n"); + test = false; + return; + } + + ncaiEnv* ncai_env = NULL; + + fprintf(stderr, "agent... \n"); + err = get_ncai_func(jvmti_env, &ncai_env, NCAI_VERSION_1_0); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: get_ncai_func() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + if (ncai_env == NULL) + { + fprintf(stderr, "test_function: get_ncai_func() returned NULL environment\n"); + test = false; + return; + } + fprintf(stderr, "agent... \n"); + /////////////////////////////////// + ncaiThread ncai_thread; + + fprintf(stderr, "calling ncai->GetThreadHandle()...\n"); + ncai_err = ncai_env->GetThreadHandle(g_thread_jthread, &ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetThreadHandle() returned error: %d", ncai_err); + test = false; + return; + } + + ncaiFrameInfo* frames; + jint frames_returned; + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + test = CheckFrames(ncai_env, ncai_thread, &frames, &frames_returned); + g_stop_thread = 1; +/* SLEEP_UNIVERSAL(500); + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + g_stop_thread = 0; + SLEEP_UNIVERSAL(500); + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + g_stop_thread = 1; */ +} + +void JNICALL callbackVMDeath(prms_VMDEATH) +{ + check_VMDEATH; + func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util); +} + +/* *********************************************************************** */ + +void Test1(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test1(env, obj); + + fprintf(stderr, "thread - pure native Test1\n"); + return Test2(env, obj); +} + +void Test2(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test2(env, obj); + + fprintf(stderr, "thread - pure native Test2\n"); + return Test3(env, obj); +} + +void Test3(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test3(env, obj); + + fprintf(stderr, "thread - pure native Test3\n"); + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1; + while(!g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + } + + return; +} + +bool CheckFrames(ncaiEnv *ncai_env, ncaiThread ncai_thread, ncaiFrameInfo** ret_frames, jint* ret_count) +{ + bool ret = true; + //warning fix + int w_fix = sizeof(ret_frames); + w_fix += sizeof(ret_count); + // + + fprintf(stderr, "agent... suspend thread \n"); + ncaiError ncai_err = ncai_env->SuspendThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->SuspendThread() returned error: %d,\n", ncai_err); + ret = false; + } + + jint frame_count; + fprintf(stderr, "calling ncai->GetFrameCount()...\n"); + ncai_err = ncai_env->GetFrameCount(NULL, &frame_count); + if (ncai_err != NCAI_ERROR_INVALID_THREAD) + { + ret = false; + } + + + fprintf(stderr, "agent... resuming thread \n"); + ncai_err = ncai_env->ResumeThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->ResumeThread() returned error: %d,\n", ncai_err); + ret = false; + } + + return ret; +} Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.cpp ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.java?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.java (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.java Wed Nov 21 08:29:40 2007 @@ -0,0 +1,90 @@ +package ncai.funcs; + +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ +public class GetFrameCount04n extends Thread{ + public native void TestFunction(); + public native void TestFunction1(); + public static native boolean stopsignal(); + public static native void resumeagent(); + + static boolean NoLibrary = false; + static { + try{ + System.loadLibrary("GetFrameCount04n"); + } + catch(Throwable e){ + NoLibrary = true; + } + } + + GetFrameCount04n(String name) + { + super(name); + } + + static public void main(String args[]) { + if(NoLibrary) return; + new GetFrameCount04n("java_thread").start(); + special_method(); + /* + while(!stopsignal()){ + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + System.out.println("\tJAVA: main: ..."); + } + + try { + sleep(1000, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + + System.out.println("\tJAVA: main - exit"); + +*/ + return; + } + + public void test_java_func1(){ + System.out.println("thread - java func1\n"); + TestFunction(); + } + + public void test_java_func2(){ + System.out.println("thread - java func2\n"); + test_java_func3(); + } + + public void test_java_func3(){ + System.out.println("thread - java func3\n"); + TestFunction1(); + resumeagent(); /* + while(!stopsignal()) + { + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + //System.out.println("\tJAVA: Thread: ..."); + }*/ + } + + static public void special_method() { + /* + * Transfer control to native part. + */ + try { + throw new InterruptedException(); + } catch (Throwable tex) { } + return; + } + + public void run() { + System.out.println("thread - java run\n"); + test_java_func1(); + } +} + + Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount04n/GetFrameCount04n.java ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.cpp URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.cpp?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.cpp (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.cpp Wed Nov 21 08:29:40 2007 @@ -0,0 +1,442 @@ +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ + +/* *********************************************************************** */ + +#include "events.h" +#include "utils.h" +#include "ncai.h" + +#ifdef POSIX +#include +#include +#else +#include +#include +#endif + +#ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) { timespec delay = {(_x_)/1000, 1000000*((_x_)%1000)}; nanosleep(&delay, NULL); } +#else // #ifdef POSIX +#define SLEEP_UNIVERSAL(_x_) Sleep((_x_)) +#endif // #ifdef POSIX + +static int g_stop_thread = 0; +static int g_resume_agent_thread = 0; +static jthread g_thread_jthread; +//static jthread g_agent_thread; + +static volatile int no_opt = 1; //used to prevent inlining; + +static bool test = false; +static bool util = false; +static bool flag = false; + +const char test_case_name[] = "GetFrameCount05n"; + +static void Test1(JNIEnv *env, jobject obj); +static void Test2(JNIEnv *env, jobject obj); +static void Test3(JNIEnv *env, jobject obj); +//static void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*); +static bool CheckFrames(ncaiEnv*, ncaiThread, ncaiFrameInfo**, jint*); + +extern "C" JNIEXPORT void JNICALL +Java_ncai_funcs_GetFrameCount05n_resumeagent(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + g_resume_agent_thread = 1; +} + +extern "C" JNIEXPORT jboolean JNICALL +Java_ncai_funcs_GetFrameCount05n_stopsignal(JNIEnv *env, jclass cls) +{ + //warning fix + int w_fix = sizeof(cls); + w_fix += sizeof(env); + // + + return g_stop_thread ? true : false; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount05n_TestFunction + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction\n"); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetMethodID(clazz, "test_java_func2", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction: GetStaticMethodID for 'test_java_func2' failed\n"); + return; + } + env->CallVoidMethod(obj, mid); + return; +} + +extern "C" JNIEXPORT void JNICALL Java_ncai_funcs_GetFrameCount05n_TestFunction1 + (JNIEnv *env, jobject obj) +{ + fprintf(stderr, "thread - native TestFunction1\n"); + Test1(env, obj); + + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1;/* + while(g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + }*/ + + return; +} + +void JNICALL ThreadStart(jvmtiEnv *jvmti_env, + JNIEnv* jni_env, + jthread thread) +{ + jvmtiPhase phase; + jvmtiError result; + jvmtiThreadInfo tinfo; + + result = jvmti_env->GetPhase(&phase); + if (result != JVMTI_ERROR_NONE || phase != JVMTI_PHASE_LIVE) + return; + + result = jvmti_env->GetThreadInfo(thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + return; + + if (strcmp(tinfo.name, "java_thread") != 0) + return; + + printf("ThreadStart: java_thread\n"); + g_thread_jthread = jni_env->NewGlobalRef(thread); +/* + jclass clazz = jni_env->FindClass("java/lang/Thread"); + if (!clazz) + { + fprintf(stderr, "\tnative: JNI: FindClass failed\n"); + return; + } + + jmethodID mid = jni_env->GetMethodID(clazz, "", "()V"); + if (!mid) + { + fprintf(stderr, "\tnative: JNI: GetMethodID failed\n"); + return; + } + + g_agent_thread = jni_env->NewObject(clazz, mid, "native_agent_thread"); + if (!g_agent_thread) + { + fprintf(stderr, "\tnative: JNI: NewObject failed\n"); + return; + } + + g_agent_thread = jni_env->NewGlobalRef(g_agent_thread); + result = jvmti_env->GetThreadInfo(g_agent_thread, &tinfo); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: JNI: GetThreadInfo failed\n"); + } + + result = jvmti_env->RunAgentThread(g_agent_thread, test_function, NULL, JVMTI_THREAD_NORM_PRIORITY); + if (result != JVMTI_ERROR_NONE) + { + fprintf(stderr, "\tnative: jvmti: RunAgentThread failed\n"); + return; + }*/ +} +/* +JNIEXPORT jint +JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) +{ + jint res; + jvmtiEnv* jvmti_env = NULL; + + res = jvm->GetEnv((void**)&jvmti_env, JVMTI_VERSION_1_0); + if (res != JNI_OK || jvmti_env == NULL) + return JNI_ERR; + + jvmtiEventCallbacks callbacks; + callbacks.ThreadStart=&ThreadStart; + + jvmti_env->SetEventCallbacks(&callbacks, sizeof(callbacks)); + jvmti_env->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL); + + return JNI_OK; +} +*/ +/* *********************************************************************** */ + +JNIEXPORT jint JNICALL Agent_OnLoad(prms_AGENT_ONLOAD) +{ + + Callbacks CB; + CB.cbThreadStart = &ThreadStart; + check_AGENT_ONLOAD; + jvmtiEvent events[] = { JVMTI_EVENT_EXCEPTION, JVMTI_EVENT_THREAD_START, JVMTI_EVENT_VM_DEATH }; + cb_exc; + cb_death; + return func_for_Agent_OnLoad(vm, options, reserved, &CB, + events, sizeof(events)/sizeof(jvmtiEvent), test_case_name, DEBUG_OUT); +} + +/* *********************************************************************** */ + +void JNICALL callbackException(jvmtiEnv *jvmti_env, JNIEnv* jni_env, + jthread thread, jmethodID method, + jlocation location, jobject exception, + jmethodID catch_method, jlocation catch_location) +{ + check_EXCPT; + if (flag) return; + + /* + * Function separate all other exceptions in all other method + */ + if (!check_phase_and_method_debug(jvmti_env, method, SPP_LIVE_ONLY, + "special_method", DEBUG_OUT)) return; + + flag = true; + util = true; + + fprintf(stderr, "agent... \n"); + SLEEP_UNIVERSAL(300); + ////////////////////ncai env get + jvmtiError err; + ncaiError ncai_err; + + jvmtiExtensionFunctionInfo* ext_info = NULL; + jint ext_count = 0; + + err = jvmti_env->GetExtensionFunctions(&ext_count, &ext_info); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + fprintf(stderr, "agent... \n"); + if (ext_count == 0 || ext_info == NULL) + { + fprintf(stderr, "test_function: GetExtensionFunctions() returned no extensions\n"); + test = false; + return; + } + + jvmtiExtensionFunction get_ncai_func = NULL; + + fprintf(stderr, "agent... \n"); + for (int k = 0; k < ext_count; k++) + { + if (strcmp(ext_info[k].id, "org.apache.harmony.vm.GetExtensionEnv") == 0) + { + get_ncai_func = ext_info[k].func; + break; + } + } + + fprintf(stderr, "agent... \n"); + if (get_ncai_func == NULL) + { + fprintf(stderr, "test_function: GetNCAIEnvironment() nas not been found among JVMTI extensions\n"); + test = false; + return; + } + + ncaiEnv* ncai_env = NULL; + + fprintf(stderr, "agent... \n"); + err = get_ncai_func(jvmti_env, &ncai_env, NCAI_VERSION_1_0); + + if (err != JVMTI_ERROR_NONE) + { + fprintf(stderr, "test_function: get_ncai_func() returned error: %d, '%s'\n", + err, get_jvmti_eror_text(err)); + test = false; + return; + } + + if (ncai_env == NULL) + { + fprintf(stderr, "test_function: get_ncai_func() returned NULL environment\n"); + test = false; + return; + } + fprintf(stderr, "agent... \n"); + /////////////////////////////////// + ncaiThread ncai_thread; + + fprintf(stderr, "calling ncai->GetThreadHandle()...\n"); + ncai_err = ncai_env->GetThreadHandle(g_thread_jthread, &ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetThreadHandle() returned error: %d", ncai_err); + test = false; + return; + } + + ncaiFrameInfo* frames; + jint frames_returned; + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + test = CheckFrames(ncai_env, ncai_thread, &frames, &frames_returned); + g_stop_thread = 1; +/* SLEEP_UNIVERSAL(500); + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + + g_stop_thread = 0; + SLEEP_UNIVERSAL(500); + + while(!g_resume_agent_thread) + SLEEP_UNIVERSAL(200); + + g_resume_agent_thread = 0; + g_stop_thread = 1; */ +} + +void JNICALL callbackVMDeath(prms_VMDEATH) +{ + check_VMDEATH; + func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util); +} + +/* *********************************************************************** */ + +void Test1(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test1(env, obj); + + fprintf(stderr, "thread - pure native Test1\n"); + return Test2(env, obj); +} + +void Test2(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test2(env, obj); + + fprintf(stderr, "thread - pure native Test2\n"); + return Test3(env, obj); +} + +void Test3(JNIEnv *env, jobject obj) +{ + if(!no_opt) + Test3(env, obj); + + fprintf(stderr, "thread - pure native Test3\n"); + jclass clazz = env->GetObjectClass(obj); + if (!clazz) + { + fprintf(stderr, "\tnative: native TestFunction1: GetObjectClass failed\n"); + return; + } + + jmethodID mid = env->GetStaticMethodID(clazz, "sleep", "(J)V"); + if (!mid) + { + fprintf(stderr, "\tnative: native TestFunction1: GetStaticMethodID for 'sleep' failed\n"); + return; + } + + g_resume_agent_thread = 1; + while(!g_stop_thread) + { + fprintf(stderr, "thread... \n"); + SLEEP_UNIVERSAL(100); +// env->CallStaticVoidMethod(clazz, mid, 500); + } + + return; +} + +bool CheckFrames(ncaiEnv *ncai_env, ncaiThread ncai_thread, ncaiFrameInfo** ret_frames, jint* ret_count) +{ + bool ret = true; + //warning fix + int w_fix = sizeof(ret_frames); + w_fix += sizeof(ret_count); + // + + fprintf(stderr, "agent... suspend thread \n"); + ncaiError ncai_err = ncai_env->SuspendThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->SuspendThread() returned error: %d,\n", ncai_err); + ret = false; + } + + jint frame_count; + fprintf(stderr, "calling ncai->GetFrameCount()...\n"); + ncai_err = ncai_env->GetFrameCount(ncai_thread, &frame_count); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->GetFrameCount() returned error: %d,\n", ncai_err); + ret = false; + } + + fprintf(stderr, "test_function: frame count = %d\n", frame_count); + + ncaiFrameInfo* frames = new ncaiFrameInfo[frame_count]; + jint frames_returned; + + + fprintf(stderr, "calling ncai->GetStackTrace()...\n"); + ncai_err = ncai_env->GetStackTrace(NULL, frame_count, frames, &frames_returned); + if (ncai_err != NCAI_ERROR_INVALID_THREAD) + { + ret = false; + } + + fprintf(stderr, "agent... resuming thread \n"); + ncai_err = ncai_env->ResumeThread(ncai_thread); + if (ncai_err != NCAI_ERROR_NONE) + { + fprintf(stderr, "ncai->ResumeThread() returned error: %d,\n", ncai_err); + ret = false; + } + + return ret; +} Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.cpp ------------------------------------------------------------------------------ svn:eol-style = native Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.java URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.java?rev=597138&view=auto ============================================================================== --- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.java (added) +++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.java Wed Nov 21 08:29:40 2007 @@ -0,0 +1,90 @@ +package ncai.funcs; + +/** + * @author Petr Ivanov + * @version $Revision: 1.1.1.1 $ + * + */ +public class GetFrameCount05n extends Thread{ + public native void TestFunction(); + public native void TestFunction1(); + public static native boolean stopsignal(); + public static native void resumeagent(); + + static boolean NoLibrary = false; + static { + try{ + System.loadLibrary("GetFrameCount05n"); + } + catch(Throwable e){ + NoLibrary = true; + } + } + + GetFrameCount05n(String name) + { + super(name); + } + + static public void main(String args[]) { + if(NoLibrary) return; + new GetFrameCount05n("java_thread").start(); + special_method(); + /* + while(!stopsignal()){ + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + System.out.println("\tJAVA: main: ..."); + } + + try { + sleep(1000, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + + System.out.println("\tJAVA: main - exit"); + +*/ + return; + } + + public void test_java_func1(){ + System.out.println("thread - java func1\n"); + TestFunction(); + } + + public void test_java_func2(){ + System.out.println("thread - java func2\n"); + test_java_func3(); + } + + public void test_java_func3(){ + System.out.println("thread - java func3\n"); + TestFunction1(); + resumeagent(); /* + while(!stopsignal()) + { + try { + sleep(100, 0); // milliseconds + } catch (java.lang.InterruptedException ie) {} + //System.out.println("\tJAVA: Thread: ..."); + }*/ + } + + static public void special_method() { + /* + * Transfer control to native part. + */ + try { + throw new InterruptedException(); + } catch (Throwable tex) { } + return; + } + + public void run() { + System.out.println("thread - java run\n"); + test_java_func1(); + } +} + + Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/GetFrameCount/GetFrameCount05n/GetFrameCount05n.java ------------------------------------------------------------------------------ svn:eol-style = native