diff --git a/vm/thread/src/thread_java_basic.c b/vm/thread/src/thread_java_basic.c index 3d29be7..870184d 100644 --- a/vm/thread/src/thread_java_basic.c +++ b/vm/thread/src/thread_java_basic.c @@ -417,6 +417,7 @@ void stop_callback() { tm_native_thread = hythread_self(); tm_java_thread = hythread_get_private_data(tm_native_thread); excn = tm_java_thread->stop_exception; + tm_native_thread->suspend_request = 0; jthread_throw_exception_object(excn); } diff --git a/vm/thread/src/thread_java_monitors.c b/vm/thread/src/thread_java_monitors.c index 9ad12cc..73512c6 100644 --- a/vm/thread/src/thread_java_monitors.c +++ b/vm/thread/src/thread_java_monitors.c @@ -315,6 +315,7 @@ IDATA VMCALL jthread_monitor_timed_wait( set_wait_monitor(monitor); set_contended_monitor(monitor); jvmti_send_wait_monitor_event(monitor, (jlong)millis); + jvmti_send_contended_enter_or_entered_monitor_event(monitor, 1); set_suspend_disable(disable_count); // should be moved to event handler @@ -349,6 +350,7 @@ IDATA VMCALL jthread_monitor_timed_wait( add_owned_monitor(monitor); disable_count = reset_suspend_disable(); set_contended_monitor(NULL); + jvmti_send_contended_enter_or_entered_monitor_event(monitor, 0); jvmti_send_waited_monitor_event(monitor, (status == APR_TIMEUP)?(jboolean)1:(jboolean)0); // should be moved to event handler set_suspend_disable(disable_count); diff --git a/vm/thread/src/thread_native_fat_monitor.c b/vm/thread/src/thread_native_fat_monitor.c index e684df6..19f68b6 100644 --- a/vm/thread/src/thread_native_fat_monitor.c +++ b/vm/thread/src/thread_native_fat_monitor.c @@ -207,6 +207,12 @@ #else status = condvar_wait_impl(mon_ptr->condition, mon_ptr->mutex, ms, nano, interruptable); //printf("finishing wait: %x, %x \n", mon_ptr->condition, hythread_self()); #endif + if(self->suspend_request) { + hymutex_unlock(mon_ptr->mutex); + hythread_safe_point(); + hymutex_lock(mon_ptr->mutex); + } + mon_ptr->recursion_count = saved_recursion; mon_ptr->owner = self; assert(mon_ptr->owner); diff --git a/vm/thread/src/thread_native_suspend.c b/vm/thread/src/thread_native_suspend.c index 60bee8f..881ebf6 100644 --- a/vm/thread/src/thread_native_suspend.c +++ b/vm/thread/src/thread_native_suspend.c @@ -333,6 +333,7 @@ void VMCALL hythread_resume(hythread_t t * @param[in] callback callback function */ IDATA hythread_set_safepoint_callback(hythread_t thread, tm_thread_event_callback_proc callback) { + IDATA status; while (apr_atomic_casptr((volatile void **)&thread->safepoint_callback, (void *)callback, (void *)NULL) != NULL); if(tm_self_tls == thread) { int old_status = thread->suspend_disable_count; @@ -346,7 +347,13 @@ IDATA hythread_set_safepoint_callback(hy send_suspend_request(thread); //let the thread execute safe point in the case it's already suspended //// - hysem_post(thread->resume_event); + status = hysem_post(thread->resume_event); + assert (status == TM_ERROR_NONE); + } + + if (thread->current_condition) { + status=hycond_notify(thread->current_condition); + assert (status == TM_ERROR_NONE); } return TM_ERROR_NONE; diff --git a/vm/thread/src/thread_ti_monitors.c b/vm/thread/src/thread_ti_monitors.c index 4fb2fdb..0ac373a 100644 --- a/vm/thread/src/thread_ti_monitors.c +++ b/vm/thread/src/thread_ti_monitors.c @@ -177,13 +177,12 @@ IDATA VMCALL jthread_raw_monitor_exit(jr */ IDATA VMCALL jthread_raw_monitor_wait(jrawMonitorID mon_ptr, I_64 millis) { hythread_monitor_t monitor; - IDATA stat; + if (!(monitor = (hythread_monitor_t)array_get(jvmti_monitor_table, (UDATA)mon_ptr))) { return TM_ERROR_INVALID_MONITOR; } - stat = hythread_monitor_wait_interruptable(monitor, millis, 0); - hythread_safe_point(); - return stat; + + return hythread_monitor_wait_interruptable(monitor, millis, 0); } /** diff --git a/vm/thread/src/thread_ti_timing.c b/vm/thread/src/thread_ti_timing.c index 0171fdf..54ff13a 100644 --- a/vm/thread/src/thread_ti_timing.c +++ b/vm/thread/src/thread_ti_timing.c @@ -62,7 +62,8 @@ IDATA VMCALL jthread_get_thread_cpu_time assert(java_thread); assert(nanos_ptr); tm_native_thread = vm_jthread_get_tm_data(java_thread); - return CONVERT_ERROR(apr_get_thread_time(tm_native_thread->os_handle,nanos_ptr)); + return CONVERT_ERROR(apr_get_thread_time(tm_native_thread->os_handle, + (apr_int64_t*) nanos_ptr)); } /** diff --git a/vm/vmcore/src/jvmti/jvmti_event.cpp b/vm/vmcore/src/jvmti/jvmti_event.cpp index 9f85545..25480e3 100644 --- a/vm/vmcore/src/jvmti/jvmti_event.cpp +++ b/vm/vmcore/src/jvmti/jvmti_event.cpp @@ -1497,8 +1497,8 @@ static void call_callback(jvmtiEvent eve case JVMTI_EVENT_MONITOR_WAITED: { jobject monitor = va_arg(args, jobject); - jboolean is_timed_out = va_arg(args, jint); //jboolean); - ((jvmtiEventMonitorWait)callback_func)((jvmtiEnv*)ti_env, jni_env, + jboolean is_timed_out = va_arg(args, jint); + ((jvmtiEventMonitorWaited)callback_func)((jvmtiEnv*)ti_env, jni_env, jthread_get_java_thread(hythread_self()), monitor, is_timed_out); break; } @@ -1523,8 +1523,18 @@ static void process_jvmti_event(jvmtiEve TIEnv *ti_env, *next_env; DebugUtilsTI *ti = VM_Global_State::loader_env->TI; void *callback_func; - + bool unwindable; + jthrowable excn = NULL; + if (! ti->isEnabled()) return; + unwindable = set_unwindable(false); + + if (!unwindable) { + if (excn = exn_get()) { + exn_clear(); + } + } + ti_env = ti->getEnvironments(); va_start(args, per_thread); while(ti_env) { @@ -1533,15 +1543,20 @@ static void process_jvmti_event(jvmtiEve && (!per_thread || !is_interested_thread(ti_env, event_type))) { ti_env = ti_env->next; continue; - } + } callback_func = ti_env->get_event_callback(event_type); if (callback_func) call_callback(event_type, jni_env, ti_env, callback_func, args); ti_env = next_env; - } + } + + assert(!exn_get()); + + if (excn) exn_raise_object(excn); + + set_unwindable(unwindable); va_end(args); - - } +} void jvmti_send_thread_start_end_event(int is_start) { diff --git a/vm/vmcore/src/jvmti/jvmti_thread.cpp b/vm/vmcore/src/jvmti/jvmti_thread.cpp index 109ed6c..c29ee24 100644 --- a/vm/vmcore/src/jvmti/jvmti_thread.cpp +++ b/vm/vmcore/src/jvmti/jvmti_thread.cpp @@ -128,7 +128,7 @@ jvmtiGetAllThreads(jvmtiEnv* env, return err; } for (i=0;iNewLocalRef(jthread_iterator_next(&iterator)); } *threads_count_ptr = java_thread_count; *threads_ptr = java_threads;