Index: trunk/vm/tests/unit/thread/test_java_basic.c =================================================================== --- trunk/vm/tests/unit/thread/test_java_basic.c (revision 454602) +++ trunk/vm/tests/unit/thread/test_java_basic.c (working copy) @@ -33,9 +33,25 @@ */ void * APR_THREAD_FUNC run_for_test_jthread_attach(apr_thread_t *thread, void *args){ tested_thread_sturct_t * tts = current_thread_tts; + hythread_t native_thread; JNIEnv * jni_env = NULL; IDATA status; - + + native_thread = hythread_self(); + if (!native_thread) { + status = hythread_attach(&native_thread); + if (status != JNI_OK) { + tts->phase = TT_PHASE_ERROR; + return 0; + } + } + + status = vm_attach((JavaVM*)args, &jni_env); + if (status != JNI_OK) { + tts->phase = TT_PHASE_ERROR; + return 0; + } + //tts->jni_env = tts_jni_env; status = jthread_attach(jni_env, tts->java_thread, JNI_FALSE); tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_ATTACHED : TT_PHASE_ERROR); @@ -47,7 +63,8 @@ } } - tts->phase = TT_PHASE_DEAD; + status = jthread_detach(tts->java_thread); + tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR); return 0; } @@ -63,6 +80,13 @@ check_tested_thread_phase(tts, TT_PHASE_ATTACHED); check_tested_thread_structures(tts); } + + reset_tested_thread_iterator(&tts); + while(next_tested_thread(&tts)){ + tts->stop = 1; + check_tested_thread_phase(tts, TT_PHASE_DEAD); + } + // Terminate all threads and clear tts structures tested_threads_destroy(); return TEST_PASSED; @@ -72,27 +96,7 @@ * Test jthread_detach() */ int test_jthread_detach (void){ - tested_thread_sturct_t * tts; - jthread *thread; - hythread_t hythread; - - // Initialize tts structures and run all tested threads - tested_threads_run(default_run_for_test); - - // Make second attach to the same jthread. - reset_tested_thread_iterator(&tts); - while(next_tested_thread(&tts)){ - check_tested_thread_phase(tts, TT_PHASE_RUNNING); - hythread = vm_jthread_get_tm_data(tts->java_thread); - thread = hythread_get_private_data(hythread); - tf_assert_same(jthread_detach(tts->java_thread), TM_ERROR_NONE); - tf_assert_null(vm_jthread_get_tm_data(tts->java_thread)); - //tf_assert_null(hythread_get_private_data(hythread)); - } - - // Terminate all threads and clear tts structures - tested_threads_destroy(); - return TEST_PASSED; + return test_jthread_attach(); } /* @@ -328,10 +332,14 @@ int test_jthread_exception_stop (void){ tested_thread_sturct_t * tts; - jobject excn = new_jobject(); + jobject excn; hythread_t hythread; jvmti_thread_t jvmti_thread; + JNIEnv * jni_env; + jni_env = jthread_get_JNI_env(jthread_self()); + excn = new_jobject_thread_death(jni_env); + // Initialize tts structures and run all tested threads tested_threads_run(run_for_test_jthread_exception_stop); @@ -448,10 +456,7 @@ */ int test_jthread_get_JNI_env(void) { - tested_thread_sturct_t *tts; - tf_assert(jthread_get_JNI_env(jthread_self()) != 0); - return TEST_PASSED; } @@ -499,14 +504,14 @@ } TEST_LIST_START - //TEST(test_jthread_attach) - //TEST(test_jthread_detach) + TEST(test_jthread_attach) + TEST(test_jthread_detach) TEST(test_hythread_create) TEST(test_hythread_create_with_function) TEST(test_jthread_get_JNI_env) TEST(test_jthread_join) //TEST(test_jthread_timed_join) - //TEST(test_jthread_exception_stop) + TEST(test_jthread_exception_stop) //TEST(test_jthread_stop) TEST(test_jthread_sleep) TEST(test_hythread_yield) Index: trunk/vm/tests/unit/thread/test_native_thin_monitor.c =================================================================== --- trunk/vm/tests/unit/thread/test_native_thin_monitor.c (revision 454602) +++ trunk/vm/tests/unit/thread/test_native_thin_monitor.c (working copy) @@ -121,7 +121,6 @@ int test_hythread_thin_monitor_enter_contended(void){ apr_pool_t *pool; void **args; - jthread_threadattr_t *attr; hythread_t thread = NULL; hythread_thin_monitor_t lockword_ptr; IDATA status; Index: trunk/vm/tests/unit/thread/test_ti_raw_monitors.c =================================================================== --- trunk/vm/tests/unit/thread/test_ti_raw_monitors.c (revision 454602) +++ trunk/vm/tests/unit/thread/test_ti_raw_monitors.c (working copy) @@ -191,7 +191,6 @@ tested_thread_sturct_t *tts; tested_thread_sturct_t *critical_tts; jrawMonitorID monitor; - int64 msec = 1000000; int i; int waiting_on_wait_nmb; Index: trunk/vm/tests/unit/thread/test_ti_timing.c =================================================================== --- trunk/vm/tests/unit/thread/test_ti_timing.c (revision 454602) +++ trunk/vm/tests/unit/thread/test_ti_timing.c (working copy) @@ -110,6 +110,7 @@ tf_assert_same(jthread_get_thread_cpu_timer_info(&timer_info), TM_ERROR_NONE); tf_assert(user_cpu_time > 0); + /* printf("=================================================== %08x\n", cpu_time); printf("cpu_time = %i \n", cpu_time); printf("user_cpu_time = %i \n", user_cpu_time); @@ -122,6 +123,7 @@ printf("may_skip_forward = %i \n", timer_info.may_skip_forward); printf("may_skip_backward = %i \n", timer_info.may_skip_backward); printf("kind = %i \n", timer_info.kind); + */ } // Terminate all threads and clear tts structures Index: trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c =================================================================== --- trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c (revision 454602) +++ trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.c (working copy) @@ -23,6 +23,7 @@ #include #include #include +#include #include "apr_time.h" @@ -41,7 +42,7 @@ apr_sleep(CLICK_TIME_MSEC * 1000); } -jthread new_jthread_jobject(JNIEnv * jni_env) { +jthread new_jobject_thread(JNIEnv * jni_env) { const char * name = ""; const char * sig = "()V"; jmethodID constructor = NULL; @@ -52,6 +53,17 @@ return (*jni_env)->NewObject(jni_env, thread_class, constructor); } +jobject new_jobject_thread_death(JNIEnv * jni_env) { + const char * name = ""; + const char * sig = "()V"; + jmethodID constructor = NULL; + jclass thread_death_class; + + thread_death_class = (*jni_env)->FindClass(jni_env, "java/lang/ThreadDeath"); + constructor = (*jni_env)->GetMethodID(jni_env, thread_death_class, name, sig); + return (*jni_env)->NewObject(jni_env, thread_death_class, constructor); +} + jthread new_jobject(){ apr_status_t status; @@ -141,7 +153,7 @@ tts = &tested_threads[i]; tts->my_index = i; //tf_assert_null(tts->java_thread); - tts->java_thread = new_jthread_jobject(jni_env); + tts->java_thread = new_jobject_thread(jni_env); //tf_assert_null(tts->jni_env); //tts->attrs.priority = 5; tts->jvmti_start_proc_arg = &tts->jvmti_start_proc_arg; @@ -272,7 +284,12 @@ apr_threadattr_t *apr_attrs = NULL; apr_status_t status; apr_pool_t *pool; + JNIEnv * jni_env; + JavaVM * java_vm; + jni_env = jthread_get_JNI_env(jthread_self()); + status = (*jni_env)->GetJavaVM(jni_env, &java_vm); + tf_assert_v(status == JNI_OK); status = apr_pool_create(&pool, NULL); tf_assert_v(status == APR_SUCCESS); tested_threads_init(TTS_INIT_COMMON_MONITOR); @@ -285,7 +302,7 @@ &apr_thread, // new thread OS handle apr_attrs, run_method_param, // start proc - NULL, // start proc arg + (void *)java_vm, // start proc arg pool ); tf_assert_v(status == APR_SUCCESS); @@ -326,7 +343,7 @@ jvmti_thread_t jvmti_thread; hythread_t hythread; - hythread = vm_jthread_get_tm_data(java_thread); + hythread = (hythread_t) vm_jthread_get_tm_data(java_thread); tf_assert(hythread); jvmti_thread = hythread_get_private_data(hythread); tf_assert(jvmti_thread); Index: trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h =================================================================== --- trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h (revision 454602) +++ trunk/vm/tests/unit/thread/utils/thread_unit_test_utils.h (working copy) @@ -98,7 +98,9 @@ int compare_threads(jthread *threads, int thread_nmb, int compare_from_end); int compare_pointer_sets(void ** set_a, void ** set_b, int nmb); int check_exception(jobject excn); -jobject new_jobject(); -void delete_jobject(jobject obj); void set_phase(tested_thread_sturct_t *tts, int phase); void JNICALL default_run_for_test(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *arg); +jthread new_jobject_thread(JNIEnv * jni_env); +jobject new_jobject_thread_death(JNIEnv * jni_env); +jthread new_jobject(); +void delete_jobject(jobject obj);