/* * Test jthread_holds_lock(...) */ void JNICALL run_for_test_jthread_holds_lock(jvmtiEnv * jvmti_env, JNIEnv * jni_env, void *args){ tested_thread_sturct_t * tts = (tested_thread_sturct_t *) args; jobject monitor = tts->monitor; IDATA status; tts->phase = TT_PHASE_WAITING_ON_MONITOR; tested_thread_started(tts); status = jthread_monitor_enter(monitor); // Begin critical section tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_IN_CRITICAL_SECTON : TT_PHASE_ERROR); hysem_set(mon_enter, 1); tested_thread_wait_for_stop_request(tts); status = jthread_monitor_exit(monitor); // End critical section tts->phase = (status == TM_ERROR_NONE ? TT_PHASE_DEAD : TT_PHASE_ERROR); tested_thread_ended(tts); }
static IDATA rt_jthread_monitor_enter(ManagedObject* monitor) { const unsigned handles_size = (unsigned)(sizeof(ObjectHandlesNew)+sizeof(ManagedObject*)*4); ObjectHandlesNew* handels = (ObjectHandlesNew *)STD_ALLOCA(handles_size); handels->capacity = 4; handels->size = 0; handels->next = NULL; m2n_set_local_handles(m2n_get_last_frame(), (ObjectHandles *) handels); ObjectHandle monitorJavaObj = oh_allocate_local_handle(); monitorJavaObj->object = monitor; IDATA result = jthread_monitor_enter(monitorJavaObj); free_local_object_handles2(m2n_get_local_handles(m2n_get_last_frame())); m2n_set_local_handles(m2n_get_last_frame(), NULL); return result; }