[vmkit-commits] [vmkit] r143903 - /vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
Will Dietz
wdietz2 at illinois.edu
Sun Nov 6 19:06:33 PST 2011
Author: wdietz2
Date: Sun Nov 6 21:06:33 2011
New Revision: 143903
URL: http://llvm.org/viewvc/llvm-project?rev=143903&view=rev
Log:
Impl JVM_Interrupt, JVM_IsInterrupted
Modified:
vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
Modified: vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc?rev=143903&r1=143902&r2=143903&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc Sun Nov 6 21:06:33 2011
@@ -629,13 +629,75 @@
}
JNIEXPORT void JNICALL
-JVM_Interrupt(JNIEnv *env, jobject thread) {
- NYI();
+JVM_Interrupt(JNIEnv *env, jobject _thread) {
+ JavaObject * thread = 0;
+ llvm_gcroot(thread, 0);
+ BEGIN_JNI_EXCEPTION
+
+ thread = *(JavaObject**)_thread;
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ JavaField * field = vm->upcalls->eetop;
+
+ // It's possible that the thread to be interrupted has not finished
+ // its initialization. Wait until the initialization is done.
+ while (field->getInstanceLongField(thread) == 0)
+ mvm::Thread::yield();
+
+ JavaThread* th = (JavaThread*)field->getInstanceLongField(thread);
+ th->lockingThread.interruptFlag = 1;
+ mvm::FatLock* lock = th->lockingThread.waitsOn;
+
+ // If the thread is blocked on a wait. We also verify nextWaiting in case
+ // the thread has been notified.
+ if (lock && th->lockingThread.nextWaiting) {
+ th->lockingThread.state = mvm::LockingThread::StateInterrupted;
+
+ // Make sure the thread is waiting.
+ uint32 locked = 0;
+ while (true) {
+ locked = (lock->tryAcquire() == 0);
+ if (locked || (lock->getOwner() != th && lock->getOwner() != 0))
+ break;
+ else mvm::Thread::yield();
+ }
+
+ // Interrupt the thread.
+ th->lockingThread.varcond.signal();
+
+ // Release the lock if we acquired it.
+ if (locked) lock->release(lock->getAssociatedObject(), vm->lockSystem);
+ }
+
+ // Here we could also raise a signal for interrupting I/O
+
+ RETURN_VOID_FROM_JNI
+ END_JNI_EXCEPTION
}
JNIEXPORT jboolean JNICALL
-JVM_IsInterrupted(JNIEnv *env, jobject thread, jboolean clearInterrupted) {
- NYI();
+JVM_IsInterrupted(JNIEnv *env, jobject _thread, jboolean clearInterrupted) {
+ JavaObject * thread = 0;
+ llvm_gcroot(thread, 0);
+
+ bool interrupt = false;
+
+ BEGIN_JNI_EXCEPTION
+
+ thread = *(JavaObject**)_thread;
+ Jnjvm* vm = JavaThread::get()->getJVM();
+ JavaField * field = vm->upcalls->eetop;
+
+ JavaThread* jth = (JavaThread*)field->getInstanceLongField(thread);
+ interrupt = (jboolean)jth->lockingThread.interruptFlag;
+
+ if (clearInterrupted)
+ jth->lockingThread.interruptFlag = 0;
+
+ RETURN_FROM_JNI(interrupt);
+
+ END_JNI_EXCEPTION
+
+ return false;
}
JNIEXPORT jboolean JNICALL
More information about the vmkit-commits
mailing list