void tested_threads_run_common(jvmtiStartFunction run_method_param){ tested_thread_sturct_t *tts; JNIEnv * jni_env = jthread_get_JNI_env(jthread_self()); reset_tested_thread_iterator(&tts); while(next_tested_thread(&tts)){ tts->attrs.proc = run_method_param; tts->attrs.arg = tts; tf_assert_same_v(jthread_create_with_function(jni_env, tts->java_thread, &tts->attrs), TM_ERROR_NONE); tested_thread_wait_started(tts); tts->native_thread = jthread_get_native_thread(tts->java_thread); } }
/** * Runs java.lang.Thread.detach() method. */ static jint run_java_detach(jthread java_thread) { assert(hythread_is_suspend_enabled()); JNIEnv *jni_env = jthread_get_JNI_env(java_thread); Global_Env *vm_env = jni_get_vm_env(jni_env); Class *thread_class = vm_env->java_lang_Thread_Class; static Method *detach = NULL; if (detach == NULL) { const char *method_name = "detach"; const char *descriptor = "(Ljava/lang/Throwable;)V"; detach = class_lookup_method(thread_class, method_name, descriptor); if (detach == NULL) { TRACE("Failed to find thread's detach method " << descriptor << " , exception = " << exn_get()); return TM_ERROR_INTERNAL; } } // Initialize arguments. jvalue args[2]; args[0].l = java_thread; if (vm_env->IsVmShutdowning()) { args[1].l = NULL; } else { args[1].l = exn_get(); } exn_clear(); hythread_suspend_disable(); vm_execute_java_method_array((jmethodID) detach, 0, args); hythread_suspend_enable(); if (exn_raised()) { TRACE ("java.lang.Thread.detach(Throwable) method completed with an exception: " << exn_get_name()); return TM_ERROR_INTERNAL; } return TM_ERROR_NONE; }
void tested_threads_init(int mode){ tested_thread_sturct_t *tts; jobject monitor; jrawMonitorID raw_monitor; JNIEnv * jni_env; IDATA status; int i; jni_env = jthread_get_JNI_env(jthread_self()); if (mode != TTS_INIT_DIFFERENT_MONITORS){ monitor = new_jobject(); status = jthread_monitor_init(monitor); tf_assert_same_v(status, TM_ERROR_NONE); } status = jthread_raw_monitor_create(&raw_monitor); tf_assert_same_v(status, TM_ERROR_NONE); reset_tested_thread_iterator(&tts); for (i = 0; i < MAX_TESTED_THREAD_NUMBER; i++){ tts = &tested_threads[i]; tts->my_index = i; tts->java_thread = new_jobject_thread(jni_env); tts->native_thread = NULL; tts->jvmti_start_proc_arg = &tts->jvmti_start_proc_arg; hysem_create(&tts->started, 0, 1); hysem_create(&tts->running, 0, 1); hysem_create(&tts->stop_request, 0, 1); hysem_create(&tts->ended, 0, 1); tts->phase = TT_PHASE_NONE; if (mode == TTS_INIT_DIFFERENT_MONITORS){ monitor = new_jobject(); status = jthread_monitor_init(monitor); tf_assert_same_v(status, TM_ERROR_NONE); } tts->monitor = monitor; tts->raw_monitor = raw_monitor; tts->excn = NULL; } }