Looks good. Again, if you could try to share that code... :)<br><br><div class="gmail_quote">On Thu, Nov 3, 2011 at 3:38 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Inlined below.<br>
<br>
Very similar to classpath code, only the field type is different, so<br>
should be using the "Long" instance accessors, not Object.<br>
<br>
~Will<br>
<br>
>From effd45eb93189cbcd18480e691e4027fcaac4868 Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Thu, 3 Nov 2011 08:57:13 -0500<br>
Subject: [PATCH 16/17] Impl JVM_Interrupt, JVM_IsInterrupted<br>
<br>
---<br>
lib/J3/ClassLib/OpenJDK/OpenJDK.inc | 70 +++++++++++++++++++++++++++++++++--<br>
1 files changed, 66 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index 48ffce9..954234d 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -700,13 +700,75 @@ JVM_CountStackFrames(JNIEnv *env, jobject thread) {<br>
}<br>
<br>
JNIEXPORT void JNICALL<br>
-JVM_Interrupt(JNIEnv *env, jobject thread) {<br>
- NYI();<br>
+JVM_Interrupt(JNIEnv *env, jobject _thread) {<br>
+ JavaObject * thread = 0;<br>
+ llvm_gcroot(thread, 0);<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ thread = *(JavaObject**)_thread;<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ JavaField * field = vm->upcalls->eetop;<br>
+<br>
+ // It's possible that the thread to be interrupted has not finished<br>
+ // its initialization. Wait until the initialization is done.<br>
+ while (field->getInstanceLongField(thread) == 0)<br>
+ mvm::Thread::yield();<br>
+<br>
+ JavaThread* th = (JavaThread*)field->getInstanceLongField(thread);<br>
+ th->lockingThread.interruptFlag = 1;<br>
+ mvm::FatLock* lock = th->lockingThread.waitsOn;<br>
+<br>
+ // If the thread is blocked on a wait. We also verify nextWaiting in case<br>
+ // the thread has been notified.<br>
+ if (lock && th->lockingThread.nextWaiting) {<br>
+ th->lockingThread.state = mvm::LockingThread::StateInterrupted;<br>
+<br>
+ // Make sure the thread is waiting.<br>
+ uint32 locked = 0;<br>
+ while (true) {<br>
+ locked = (lock->tryAcquire() == 0);<br>
+ if (locked || (lock->getOwner() != th && lock->getOwner() != 0))<br>
+ break;<br>
+ else mvm::Thread::yield();<br>
+ }<br>
+<br>
+ // Interrupt the thread.<br>
+ th->lockingThread.varcond.signal();<br>
+<br>
+ // Release the lock if we acquired it.<br>
+ if (locked) lock->release(lock->getAssociatedObject(), vm->lockSystem);<br>
+ }<br>
+<br>
+ // Here we could also raise a signal for interrupting I/O<br>
+<br>
+ RETURN_VOID_FROM_JNI<br>
+ END_JNI_EXCEPTION<br>
}<br>
<br>
JNIEXPORT jboolean JNICALL<br>
-JVM_IsInterrupted(JNIEnv *env, jobject thread, jboolean clearInterrupted) {<br>
- NYI();<br>
+JVM_IsInterrupted(JNIEnv *env, jobject _thread, jboolean clearInterrupted) {<br>
+ JavaObject * thread = 0;<br>
+ llvm_gcroot(thread, 0);<br>
+<br>
+ bool interrupt = false;<br>
+<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ thread = *(JavaObject**)_thread;<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ JavaField * field = vm->upcalls->eetop;<br>
+<br>
+ JavaThread* jth = (JavaThread*)field->getInstanceLongField(thread);<br>
+ interrupt = (jboolean)jth->lockingThread.interruptFlag;<br>
+<br>
+ if (clearInterrupted)<br>
+ jth->lockingThread.interruptFlag = 0;<br>
+<br>
+ RETURN_FROM_JNI(interrupt);<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return false;<br>
}<br>
<br>
JNIEXPORT jboolean JNICALL<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></span></blockquote></div><br>