Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,289 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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;
+//jthread g_agent_thread;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "ResumeThread01n";
+/*
+static void Test1(JNIEnv *env, jobject obj);
+static void Test2(JNIEnv *env, jobject obj);
+static void Test3(JNIEnv *env, jobject obj);*/
+//void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*);
+static bool CheckResume(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_ResumeThread01n_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_ResumeThread01n_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_ResumeThread01n_TestFunction1
+ (JNIEnv *env, jobject obj)
+{
+ fprintf(stderr, "thread - native TestFunction1\n");
+
+ //warning fix
+ int w_fix = sizeof(obj);
+ w_fix += sizeof(env);
+ //
+
+/* g_resume_agent_thread = 1;
+ while(!g_stop_thread)
+ {
+ fprintf(stderr, "thread... \n");
+ SLEEP_UNIVERSAL(100);
+ }
+*/
+ g_resume_agent_thread = 1;
+
+ 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, "<init>", "()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(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;
+ }
+
+ while(!g_resume_agent_thread)
+ SLEEP_UNIVERSAL(200);
+
+ g_resume_agent_thread = 0;
+
+ test = CheckResume(ncai_env, ncai_thread);
+
+ g_stop_thread = 1;
+ SLEEP_UNIVERSAL(500);
+}
+
+void JNICALL callbackVMDeath(prms_VMDEATH)
+{
+ check_VMDEATH;
+ func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util);
+}
+
+/* *********************************************************************** */
+
+bool CheckResume(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{
+ ncaiError ncai_err = ncai_env->ResumeThread(ncai_thread);
+ if (ncai_err != NCAI_ERROR_THREAD_NOT_ALIVE)
+ {
+ fprintf(stderr, "ncai->ResumeThread() returned invalid error: %d,\n", ncai_err);
+ return false;
+ }
+
+ return true;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread01n/ResumeThread01n.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,66 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class ResumeThread01n 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("ResumeThread01n");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ ResumeThread01n(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new ResumeThread01n("java_thread").start();
+ special_method();
+ return;
+ }
+
+ public void test_java_func1(){
+ System.out.println("thread - java func1\n");
+ TestFunction1();
+ }
+
+ 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");
+ }
+
+ 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/SuspendResumeThread/ResumeThread01n/ResumeThread01n.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,310 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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 volatile int g_resume_agent_thread = 0;
+static jthread g_thread_jthread;
+//static jthread g_agent_thread;
+
+//volatile int no_opt = 1; //used to prevent inlining;
+
+//static int counter = 0;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "ResumeThread02n";
+/*
+void Test1(JNIEnv *env, jobject obj);
+void Test2(JNIEnv *env, jobject obj);
+void Test3(JNIEnv *env, jobject obj);
+void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*);*/
+static bool CheckResume(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_ResumeThread02n_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_ResumeThread02n_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_ResumeThread02n_TestFunction1
+ (JNIEnv *env, jobject obj)
+{
+ fprintf(stderr, "thread - native TestFunction1\n");
+
+ //warning fix
+ int w_fix = sizeof(obj);
+ w_fix += sizeof(env);
+ //
+
+ g_resume_agent_thread = 1;
+ while(!g_stop_thread)
+ {
+ fprintf(stderr, "thread... \n");
+ SLEEP_UNIVERSAL(100);
+ }
+
+ g_resume_agent_thread = 1;
+
+ 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, "<init>", "()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(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;
+ g_stop_thread = 1;
+ return;
+ }
+
+ fprintf(stderr, "agent... \n");
+ if (ext_count == 0 || ext_info == NULL)
+ {
+ fprintf(stderr, "test_function: GetExtensionFunctions() returned no extensions\n");
+ test = false;
+ g_stop_thread = 1;
+ 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;
+ g_stop_thread = 1;
+ 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;
+ g_stop_thread = 1;
+ return;
+ }
+
+ if (ncai_env == NULL)
+ {
+ fprintf(stderr, "test_function: get_ncai_func() returned NULL environment\n");
+ test = false;
+ g_stop_thread = 1;
+ 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;
+ g_stop_thread = 1;
+ return;
+ }
+
+ while(!g_resume_agent_thread)
+ {
+ fprintf(stderr, "Agent...");
+ SLEEP_UNIVERSAL(200);
+ }
+
+ g_resume_agent_thread = 0;
+ g_stop_thread = 1;
+
+ while(!g_resume_agent_thread)
+ {
+ fprintf(stderr, "Agent...");
+ SLEEP_UNIVERSAL(200);
+ }
+
+ test = CheckResume(ncai_env, ncai_thread);
+
+ g_stop_thread = 1;
+ SLEEP_UNIVERSAL(500);
+}
+
+void JNICALL callbackVMDeath(prms_VMDEATH)
+{
+ check_VMDEATH;
+ func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util);
+}
+
+/* *********************************************************************** */
+
+bool CheckResume(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{
+ ncaiError ncai_err = ncai_env->ResumeThread(ncai_thread);
+ if (ncai_err != NCAI_ERROR_THREAD_NOT_ALIVE)
+ {
+ fprintf(stderr, "ncai->ResumeThread() returned invalid error: %d,\n", ncai_err);
+ g_stop_thread = 1;
+ return false;
+ }
+
+ return true;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread02n/ResumeThread02n.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,66 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class ResumeThread02n 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("ResumeThread02n");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ ResumeThread02n(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new ResumeThread02n("java_thread").start();
+ special_method();
+ return;
+ }
+
+ public void test_java_func1(){
+ System.out.println("thread - java func1\n");
+ TestFunction1();
+ }
+
+ 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");
+ }
+
+ 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/SuspendResumeThread/ResumeThread02n/ResumeThread02n.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,295 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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 volatile int g_resume_agent_thread = 0;
+static jthread g_thread_jthread;
+//static jthread g_agent_thread;
+
+//volatile int no_opt = 1; //used to prevent inlining;
+
+//static int counter = 0;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "ResumeThread03n";
+/*
+void Test1(JNIEnv *env, jobject obj);
+void Test2(JNIEnv *env, jobject obj);
+void Test3(JNIEnv *env, jobject obj);
+void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*);*/
+static bool CheckResume(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_ResumeThread03n_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_ResumeThread03n_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_ResumeThread03n_TestFunction1
+ (JNIEnv *env, jobject obj)
+{
+ fprintf(stderr, "thread - native TestFunction1\n");
+
+ //warning fix
+ int w_fix = sizeof(obj);
+ w_fix += sizeof(env);
+ //
+
+ g_resume_agent_thread = 1;
+ while(!g_stop_thread)
+ {
+ fprintf(stderr, "thread... \n");
+ SLEEP_UNIVERSAL(100);
+ }
+
+ 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, "<init>", "()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(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;
+ }
+
+ while(!g_resume_agent_thread)
+ SLEEP_UNIVERSAL(200);
+
+ g_resume_agent_thread = 0;
+
+ test = CheckResume(ncai_env, ncai_thread);
+
+ g_stop_thread = 1;
+ SLEEP_UNIVERSAL(500);
+}
+
+void JNICALL callbackVMDeath(prms_VMDEATH)
+{
+ check_VMDEATH;
+ func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util);
+}
+
+/* *********************************************************************** */
+
+bool CheckResume(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{
+ //warning fix
+ int w_fix = 0;
+ w_fix += sizeof(ncai_thread);
+ //
+ ncaiError ncai_err = ncai_env->ResumeThread(NULL);
+ if (ncai_err != NCAI_ERROR_INVALID_THREAD)
+ {
+ fprintf(stderr, "ncai->ResumeThread() returned invalid error: %d,\n", ncai_err);
+ return false;
+ }
+
+ return true;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/ResumeThread03n/ResumeThread03n.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,66 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class ResumeThread03n 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("ResumeThread03n");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ ResumeThread03n(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new ResumeThread03n("java_thread").start();
+ special_method();
+ return;
+ }
+
+ public void test_java_func1(){
+ System.out.println("thread - java func1\n");
+ TestFunction1();
+ }
+
+ 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");
+ }
+
+ 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/SuspendResumeThread/ResumeThread03n/ResumeThread03n.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,394 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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 volatile int g_resume_agent_thread = 0;
+static jthread g_thread_jthread;
+//jthread g_agent_thread;
+
+static volatile int no_opt = 1; //used to prevent inlining;
+
+static int counter = 0;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "SuspendThread01";
+
+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 CheckSuspend(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_SuspendThread01_resumeagent(JNIEnv *env, jclass cls)
+{
+ //warning fix
+ int w_fix = sizeof(cls);
+ w_fix += sizeof(env);
+ //
+
+ g_resume_agent_thread = 1;
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_SuspendThread01_increment(JNIEnv *env, jclass cls)
+{
+ //warning fix
+ int w_fix = sizeof(cls);
+ w_fix += sizeof(env);
+ //
+
+ counter++;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_ncai_funcs_SuspendThread01_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_SuspendThread01_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_SuspendThread01_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)
+ {
+ SLEEP_UNIVERSAL(100);
+// env->CallStaticVoidMethod(clazz, mid, 500);
+ }
+
+ counter++;
+ 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);
+}
+
+/* *********************************************************************** */
+
+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");
+
+ ////////////////////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;
+ }
+
+ fprintf(stderr, "counter... %d\n", counter);
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from Test3
+ SLEEP_UNIVERSAL(100);
+
+ g_resume_agent_thread = 0;
+
+ test = CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 1; // Resume execution of java_thread in Test3
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from TestFunction1
+ SLEEP_UNIVERSAL(100);
+
+ g_resume_agent_thread = 0;
+
+ test = test && CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 0; // Resume execution of java_thread in TestFunction1
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from test_java_func3
+ SLEEP_UNIVERSAL(100);
+
+ g_resume_agent_thread = 0;
+
+ test = test && CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 1; // Resume execution of java_thread in test_java_func3
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from test_java_func3
+ SLEEP_UNIVERSAL(100);
+
+ if(counter != 3)
+ test = false;
+}
+
+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)
+ {
+ SLEEP_UNIVERSAL(100);
+// env->CallStaticVoidMethod(clazz, mid, 500);
+ }
+
+ counter++;
+ return;
+}
+
+bool CheckSuspend(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{
+ bool ret = true;
+
+ for (int i = 0; i < 40; i++)
+ {
+ fprintf(stderr, ".");
+ 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;
+ break;
+ }
+
+ fprintf(stderr, "-");
+ 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;
+ break;
+ }
+ }
+
+ fprintf(stderr, "\n");
+
+ if (!ret)
+ ncai_env->TerminateThread(ncai_thread);
+
+ return ret;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,75 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class SuspendThread01 extends Thread{
+ public native void TestFunction();
+ public native void TestFunction1();
+ public static native boolean stopsignal();
+ public static native void resumeagent();
+ public static native void increment();
+
+ static boolean NoLibrary = false;
+ static {
+ try{
+ System.loadLibrary("SuspendThread01");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ SuspendThread01(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new SuspendThread01("java_thread").start();
+ special_method();
+ }
+
+ 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) {}
+ }
+ increment();
+ resumeagent();
+ }
+
+ static public void special_method() {
+ /*
+ * Transfer control to native part.
+ */
+ try {
+ throw new InterruptedException();
+ } catch (Throwable tex) { }
+ }
+
+ public void run() {
+ System.out.println("thread - java run\n");
+ test_java_func1();
+ }
+}
+
+
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01/SuspendThread01.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,293 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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 volatile int g_resume_agent_thread = 0;
+static jthread g_thread_jthread;
+//static jthread g_agent_thread;
+
+//volatile int no_opt = 1; //used to prevent inlining;
+
+//static int counter = 0;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "SuspendThread01n";
+/*
+void Test1(JNIEnv *env, jobject obj);
+void Test2(JNIEnv *env, jobject obj);
+void Test3(JNIEnv *env, jobject obj);
+void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*);*/
+static bool CheckSuspend(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_SuspendThread01n_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_SuspendThread01n_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_SuspendThread01n_TestFunction1
+ (JNIEnv *env, jobject obj)
+{
+ fprintf(stderr, "thread - native TestFunction1\n");
+
+ //warning fix
+ int w_fix = sizeof(obj);
+ w_fix += sizeof(env);
+ //
+
+/* g_resume_agent_thread = 1;
+ while(!g_stop_thread)
+ {
+ fprintf(stderr, "thread... \n");
+ SLEEP_UNIVERSAL(100);
+ }
+*/
+ g_resume_agent_thread = 1;
+
+ 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, "<init>", "()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(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;
+ }
+
+ while(!g_resume_agent_thread)
+ SLEEP_UNIVERSAL(200);
+
+ g_resume_agent_thread = 0;
+
+ test = CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 1;
+ SLEEP_UNIVERSAL(500);
+}
+
+void JNICALL callbackVMDeath(prms_VMDEATH)
+{
+ check_VMDEATH;
+ func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util);
+}
+
+/* *********************************************************************** */
+
+bool CheckSuspend(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{
+ ncaiError ncai_err = ncai_env->SuspendThread(ncai_thread);
+ if (ncai_err != NCAI_ERROR_THREAD_NOT_ALIVE)
+ {
+ fprintf(stderr, "ncai->SuspendThread() returned invalid error: %d,\n", ncai_err);
+ return false;
+ }
+
+ return true;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread01n/SuspendThread01n.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,66 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class SuspendThread01n 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("SuspendThread01n");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ SuspendThread01n(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new SuspendThread01n("java_thread").start();
+ special_method();
+ return;
+ }
+
+ public void test_java_func1(){
+ System.out.println("thread - java func1\n");
+ TestFunction1();
+ }
+
+ 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");
+ }
+
+ 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/SuspendResumeThread/SuspendThread01n/SuspendThread01n.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,412 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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 volatile int g_resume_agent_thread = 0;
+static jthread g_thread_jthread;
+//jthread g_agent_thread;
+
+static volatile int no_opt = 1; //used to prevent inlining;
+
+static int counter = 0;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "SuspendThread02";
+
+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 CheckSuspend(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_SuspendThread02_resumeagent(JNIEnv *env, jclass cls)
+{
+ //warning fix
+ int w_fix = sizeof(cls);
+ w_fix += sizeof(env);
+ //
+
+ g_resume_agent_thread = 1;
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_SuspendThread02_increment(JNIEnv *env, jclass cls)
+{
+ //warning fix
+ int w_fix = sizeof(cls);
+ w_fix += sizeof(env);
+ //
+
+ counter++;
+}
+
+extern "C" JNIEXPORT jboolean JNICALL
+Java_ncai_funcs_SuspendThread02_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_SuspendThread02_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_SuspendThread02_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)
+ {
+ SLEEP_UNIVERSAL(100);
+// env->CallStaticVoidMethod(clazz, mid, 500);
+ }
+
+ counter++;
+ 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);
+}
+
+/* *********************************************************************** */
+
+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");
+
+ ////////////////////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;
+ }
+
+ fprintf(stderr, "counter... %d\n", counter);
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from Test3
+ SLEEP_UNIVERSAL(100);
+
+ g_resume_agent_thread = 0;
+
+ test = CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 1; // Resume execution of java_thread in Test3
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from TestFunction1
+ SLEEP_UNIVERSAL(100);
+
+ g_resume_agent_thread = 0;
+
+ test = test && CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 0; // Resume execution of java_thread in TestFunction1
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from test_java_func3
+ SLEEP_UNIVERSAL(100);
+
+ g_resume_agent_thread = 0;
+
+ test = test && CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 1; // Resume execution of java_thread in test_java_func3
+
+ while (!g_resume_agent_thread) // Waiting for resume signal from test_java_func3
+ SLEEP_UNIVERSAL(100);
+
+ if(counter != 3)
+ test = false;
+}
+
+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)
+ {
+ SLEEP_UNIVERSAL(100);
+// env->CallStaticVoidMethod(clazz, mid, 500);
+ }
+
+ counter++;
+ return;
+}
+
+bool CheckSuspend(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{
+ bool ret = true;
+
+ for (int i = 0; i < 40; i++)
+ {
+ fprintf(stderr, ".");
+ 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;
+ break;
+ }
+
+ fprintf(stderr, ".");
+ 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;
+ break;
+ }
+
+ fprintf(stderr, "-");
+ 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;
+ break;
+ }
+
+ fprintf(stderr, "-");
+ 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;
+ break;
+ }
+ }
+
+ fprintf(stderr, "\n");
+
+ if (!ret)
+ ncai_env->TerminateThread(ncai_thread);
+
+ return ret;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02/SuspendThread02.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,77 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class SuspendThread02 extends Thread{
+ public native void TestFunction();
+ public native void TestFunction1();
+ public static native boolean stopsignal();
+ public static native void resumeagent();
+ public static native void increment();
+
+ static boolean NoLibrary = false;
+ static {
+ try{
+ System.loadLibrary("SuspendThread02");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ SuspendThread02(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new SuspendThread02("java_thread").start();
+ special_method();
+ }
+
+ 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();
+ System.out.println("thread - java func3\n");
+ resumeagent();
+ while(!stopsignal())
+ {
+ try {
+ sleep(100, 0); // milliseconds
+ } catch (java.lang.InterruptedException ie) {}
+ }
+ increment();
+ resumeagent();
+ }
+
+ 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/SuspendResumeThread/SuspendThread02/SuspendThread02.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.cpp?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.cpp (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.cpp Wed Nov 21 08:29:40 2007
@@ -0,0 +1,304 @@
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+
+/* *********************************************************************** */
+
+#include "events.h"
+#include "utils.h"
+#include "ncai.h"
+
+#ifdef POSIX
+#include <stdlib.h>
+#include <time.h>
+#else
+#include <windows.h>
+#include <CRTDBG.H>
+#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 volatile int g_resume_agent_thread = 0;
+static jthread g_thread_jthread;
+//static jthread g_agent_thread;
+
+//volatile int no_opt = 1; //used to prevent inlining;
+
+//static int counter = 0;
+
+static bool test = false;
+static bool util = false;
+static bool flag = false;
+
+const char test_case_name[] = "SuspendThread02n";
+/*
+void Test1(JNIEnv *env, jobject obj);
+void Test2(JNIEnv *env, jobject obj);
+void Test3(JNIEnv *env, jobject obj);
+void JNICALL test_function(jvmtiEnv*, JNIEnv*, void*);*/
+static bool CheckSuspend(ncaiEnv*, ncaiThread);
+
+extern "C" JNIEXPORT void JNICALL
+Java_ncai_funcs_SuspendThread02n_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_SuspendThread02n_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_SuspendThread02n_TestFunction1
+ (JNIEnv *env, jobject obj)
+{
+ fprintf(stderr, "thread - native TestFunction1\n");
+
+ //warning fix
+ int w_fix = sizeof(obj);
+ w_fix += sizeof(env);
+ //
+
+ g_resume_agent_thread = 1;
+ while(!g_stop_thread)
+ {
+ fprintf(stderr, "thread... \n");
+ SLEEP_UNIVERSAL(100);
+ }
+
+ g_resume_agent_thread = 1;
+ 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, "<init>", "()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(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;
+ }
+
+ while(!g_resume_agent_thread)
+ SLEEP_UNIVERSAL(200);
+
+ g_resume_agent_thread = 0;
+ g_stop_thread = 1;
+
+ while(!g_resume_agent_thread)
+ SLEEP_UNIVERSAL(200);
+
+ g_resume_agent_thread = 0;
+
+ test = CheckSuspend(ncai_env, ncai_thread);
+
+ g_stop_thread = 1;
+ SLEEP_UNIVERSAL(500);
+}
+
+void JNICALL callbackVMDeath(prms_VMDEATH)
+{
+ check_VMDEATH;
+ func_for_callback_VMDeath(jni_env, jvmti_env, test_case_name, test, util);
+}
+
+/* *********************************************************************** */
+
+bool CheckSuspend(ncaiEnv *ncai_env, ncaiThread ncai_thread)
+{/*
+ ncaiError ncai_err = ncai_env->TerminateThread(ncai_thread);
+ if (ncai_err != NCAI_ERROR_NONE)
+ {
+ fprintf(stderr, "ncai->TerminateThread() returned error: %d,\n", ncai_err);
+ return false;
+ }
+*/
+ ncaiError ncai_err = ncai_env->SuspendThread(ncai_thread);
+ if (ncai_err != NCAI_ERROR_THREAD_NOT_ALIVE)
+ {
+ fprintf(stderr, "ncai->SuspendThread() returned invalid error: %d,\n", ncai_err);
+ return false;
+ }
+
+ return true;
+}
Propchange: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.java?rev=597138&view=auto
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.java (added)
+++ harmony/enhanced/drlvm/trunk/vm/tests/ncai/funcs/SuspendResumeThread/SuspendThread02n/SuspendThread02n.java Wed Nov 21 08:29:40 2007
@@ -0,0 +1,66 @@
+package ncai.funcs;
+
+/**
+ * @author Petr Ivanov
+ * @version $Revision: 1.1.1.1 $
+ *
+ */
+public class SuspendThread02n 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("SuspendThread02n");
+ }
+ catch(Throwable e){
+ NoLibrary = true;
+ }
+ }
+
+ SuspendThread02n(String name)
+ {
+ super(name);
+ }
+
+ static public void main(String args[]) {
+ if(NoLibrary) return;
+ new SuspendThread02n("java_thread").start();
+ special_method();
+ return;
+ }
+
+ public void test_java_func1(){
+ System.out.println("thread - java func1\n");
+ TestFunction1();
+ }
+
+ 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");
+ }
+
+ 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/SuspendResumeThread/SuspendThread02n/SuspendThread02n.java
------------------------------------------------------------------------------
svn:eol-style = native
|