Looks good! Please commit.<br><br><div class="gmail_quote">On Tue, Nov 1, 2011 at 5:54 AM, 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>
~Will<br>
<br>
>From 0ed273dac8e45e630b292d52b6463b965d43f265 Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Mon, 31 Oct 2011 22:16:10 -0500<br>
Subject: [PATCH 6/8] Impl JVM_InternString, JVM_StartThread,<br>
 JVM_IsThreadAlive<br>
<br>
---<br>
 lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp |   21 -------<br>
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc     |   95 ++++++++++++++++++++++++++++++-<br>
 2 files changed, 92 insertions(+), 24 deletions(-)<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
index d9fa7d7..43ff227 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
+++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp<br>
@@ -367,27 +367,6 @@ extern "C" void<br>
Java_java_lang_ref_PhantomReference__0003Cinit_0003E__Ljava_lang<br>
   END_NATIVE_EXCEPTION<br>
 }<br>
<br>
-extern "C" JavaString* Java_java_lang_VMString_intern__Ljava_lang_String_2(<br>
-    JavaString* obj) {<br>
-  const ArrayUInt16* array = 0;<br>
-  JavaString* res = 0;<br>
-  llvm_gcroot(obj, 0);<br>
-  llvm_gcroot(array, 0);<br>
-  llvm_gcroot(res, 0);<br>
-  // If the string is already interned, just return.<br>
-  if (obj->getVirtualTable() == JavaString::internStringVT) return obj;<br>
-<br>
-  BEGIN_NATIVE_EXCEPTION(0)<br>
-<br>
-  Jnjvm* vm = JavaThread::get()->getJVM();<br>
-  array = JavaString::strToArray(obj, vm);<br>
-  res = vm->constructString(array);<br>
-<br>
-  END_NATIVE_EXCEPTION<br>
-<br>
-  return res;<br>
-}<br>
-<br>
 extern "C" JavaObject*<br>
Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) {<br>
<br>
   JavaObject* res = 0;<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index e0000f2..e19bf96 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -165,7 +165,28 @@ JVM_Clone(JNIEnv *env, jobject obj) {<br>
  */<br>
 JNIEXPORT jstring JNICALL<br>
 JVM_InternString(JNIEnv *env, jstring _str) {<br>
-  NYI();<br>
+  JavaString * str = *(JavaString**)_str;<br>
+  const ArrayUInt16* array = 0;<br>
+  JavaString * res = 0;<br>
+  llvm_gcroot(str, 0);<br>
+  llvm_gcroot(array, 0);<br>
+  llvm_gcroot(res, 0);<br>
+<br>
+  // If already intern'd, just return.<br>
+  if(str->getVirtualTable() == JavaString::internStringVT)<br>
+    return _str;<br>
+<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  array = JavaString::strToArray(str, vm);<br>
+  res = vm->constructString(array);<br>
+<br>
+  RETURN_FROM_JNI((jstring)th->pushJNIRef(res))<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 /*<br>
@@ -449,12 +470,67 @@ JVM_DisableCompiler(JNIEnv *env, jclass compCls) {<br>
   NYI();<br>
 }<br>
<br>
+void start(JavaThread* thread) {<br>
+<br>
+  JavaObject* javaThread = NULL;<br>
+  llvm_gcroot(javaThread, 0);<br>
+<br>
+  Jnjvm* vm = thread->getJVM();<br>
+<br>
+  // Wait some time to let the creator initialise this field<br>
+  while (thread->javaThread == NULL) {<br>
+    mvm::Thread::yield();<br>
+  }<br>
+<br>
+  javaThread = thread->javaThread;<br>
+  assert(javaThread && "Didn't fix the javaThread of a j3 thread");<br>
+<br>
+  // Ok, now that the thread is created we can set the the value of eetop<br>
+  // which points from the javaobject to our internal JavaThread<br>
+  vm->upcalls->eetop->setInstanceLongField(javaThread, (long)thread);<br>
+<br>
+  // If the thread is not a daemon, it is added to the list of threads to<br>
+  // wait until exit.<br>
+  bool isDaemon = vm->upcalls->daemon->getInstanceInt8Field(javaThread);<br>
+<br>
+  if (!isDaemon) {<br>
+    vm->threadSystem.enter();<br>
+  }<br>
+<br>
+  assert(javaThread->getVirtualTable());<br>
+  // Run the VMThread::run function<br>
+  vm->upcalls->runThread->invokeIntSpecial(vm,<br>
vm->upcalls->newThread, javaThread);<br>
+<br>
+  // Remove the thread from the list.<br>
+  if (!isDaemon) {<br>
+    vm->threadSystem.leave();<br>
+  }<br>
+}<br>
 /*<br>
  * java.lang.Thread<br>
  */<br>
 JNIEXPORT void JNICALL<br>
 JVM_StartThread(JNIEnv *env, jobject _thread) {<br>
-  NYI();<br>
+  JavaObject * thread = 0;<br>
+  JavaThread * javaThread = 0;<br>
+  llvm_gcroot(thread, 0);<br>
+  llvm_gcroot(javaThread, 0);<br>
+  BEGIN_JNI_EXCEPTION<br>
+<br>
+  thread = *(JavaObject**)_thread;<br>
+  assert(thread);<br>
+  assert(thread->getVirtualTable());<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+<br>
+  JavaThread * newTh = new JavaThread(vm);<br>
+  if (!newTh) vm->outOfMemoryError();<br>
+  newTh->start((void (*)(mvm::Thread*))start);<br>
+<br>
+  newTh->initialise(thread, 0);<br>
+<br>
+  RETURN_VOID_FROM_JNI<br>
+<br>
+  END_JNI_EXCEPTION<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
@@ -464,7 +540,20 @@ JVM_StopThread(JNIEnv *env, jobject thread,<br>
jobject exception) {<br>
<br>
 JNIEXPORT jboolean JNICALL<br>
 JVM_IsThreadAlive(JNIEnv *env, jobject _thread) {<br>
-  NYI();<br>
+  BEGIN_JNI_EXCEPTION<br>
+  JavaObject * thread = *(JavaObject**)_thread;<br>
+  llvm_gcroot(thread, 0);<br>
+  assert(thread);<br>
+<br>
+  Jnjvm* vm = JavaThread::get()->getJVM();<br>
+  jint status = vm->upcalls->threadStatus->getInstanceInt32Field(thread);<br>
+<br>
+  // TODO: We don't actually maintain 'status'...<br>
+  RETURN_FROM_JNI(status != 0);<br>
+<br>
+  END_JNI_EXCEPTION<br>
+<br>
+  return 0;<br>
 }<br>
<br>
 JNIEXPORT void JNICALL<br>
<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></blockquote></div><br>