Index: include/open/jthread.h =================================================================== --- include/open/jthread.h (revision 448887) +++ include/open/jthread.h (working copy) @@ -193,6 +193,7 @@ IDATA jthread_park(); IDATA jthread_timed_park(jlong millis, jint nanos); IDATA jthread_unpark(jthread thread); + IDATA jthread_park_until(jlong milis); //@} /** @name Suspension Index: vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp =================================================================== --- vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp (revision 448887) +++ vmcore/src/kernel_classes/native/java_util_concurrent_locks_LockSupport.cpp (working copy) @@ -28,6 +28,7 @@ * Method: java.util.concurrent.locks.LockSupport.unpark(Ljava/lang/Thread;)V */ JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_unpark (JNIEnv *jenv, jclass, jobject thread) { + if (!thread) return; jthread_unpark(thread); } @@ -58,8 +59,7 @@ /* * Method: java.util.concurrent.locks.LockSupport.parkUntil(J)V */ -JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_parkUntil(JNIEnv * UNREF jenv, jclass UNREF thread, jlong milis) { - //FIXME integration should be parkUntil - jthread_timed_park((jlong)milis, 0); +JNIEXPORT void JNICALL Java_java_util_concurrent_locks_LockSupport_parkUntil(JNIEnv * UNREF jenv, jclass UNREF thread, jlong millis) { + jthread_park_until((jlong)millis); } Index: thread/src/thread_java_park.c =================================================================== --- thread/src/thread_java_park.c (revision 448887) +++ thread/src/thread_java_park.c (working copy) @@ -24,6 +24,7 @@ * @brief Java thread park/unpark functions */ +#include #include #include #include "thread_private.h" @@ -79,3 +80,19 @@ return TM_ERROR_NONE; } + +/** + * Parks the current thread until the specified deadline + * + * Stops the current thread from executing until it is unparked, interrupted, + * or until the specified dealine. + * Unlike wait or sleep, the interrupted flag is NOT cleared by this API. + * + * @param[in] millis absolute time in milliseconds to wait until + * @sa java.util.concurrent.locks.LockSupport.parkUntil() + */ +IDATA VMCALL jthread_park_until(jlong millis) { + jlong delta = millis - apr_time_now()/1000; + if (delta <= 0) return TM_ERROR_NONE; + return hythread_park((I_64)delta, 0); +} Index: thread/src/thread_native_condvar.c =================================================================== --- thread/src/thread_native_condvar.c (revision 448887) +++ thread/src/thread_native_condvar.c (working copy) @@ -58,8 +58,6 @@ // check interrupted flag if (interruptable && (this_thread->state & TM_THREAD_STATE_INTERRUPTED)) { - // clean interrupted flag - this_thread->state &= (~TM_THREAD_STATE_INTERRUPTED); return TM_ERROR_INTERRUPT; } @@ -75,8 +73,6 @@ // check interrupted flag if (interruptable && (this_thread->state & TM_THREAD_STATE_INTERRUPTED)) { - // clean interrupted flag - this_thread->state &= (~TM_THREAD_STATE_INTERRUPTED); return TM_ERROR_INTERRUPT; }