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>