[vmkit-commits] [PATCH] Impl JVM_InternString, JVM_StartThread, JVM_IsThreadAlive

Will Dietz wdietz2 at illinois.edu
Mon Oct 31 21:54:39 PDT 2011


Inlined below.

~Will

>From 0ed273dac8e45e630b292d52b6463b965d43f265 Mon Sep 17 00:00:00 2001
From: Will Dietz <w at wdtz.org>
Date: Mon, 31 Oct 2011 22:16:10 -0500
Subject: [PATCH 6/8] Impl JVM_InternString, JVM_StartThread,
 JVM_IsThreadAlive

---
 lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp |   21 -------
 lib/J3/ClassLib/OpenJDK/OpenJDK.inc     |   95 ++++++++++++++++++++++++++++++-
 2 files changed, 92 insertions(+), 24 deletions(-)

diff --git a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
index d9fa7d7..43ff227 100644
--- a/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
+++ b/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
@@ -367,27 +367,6 @@ extern "C" void
Java_java_lang_ref_PhantomReference__0003Cinit_0003E__Ljava_lang
   END_NATIVE_EXCEPTION
 }

-extern "C" JavaString* Java_java_lang_VMString_intern__Ljava_lang_String_2(
-    JavaString* obj) {
-  const ArrayUInt16* array = 0;
-  JavaString* res = 0;
-  llvm_gcroot(obj, 0);
-  llvm_gcroot(array, 0);
-  llvm_gcroot(res, 0);
-  // If the string is already interned, just return.
-  if (obj->getVirtualTable() == JavaString::internStringVT) return obj;
-
-  BEGIN_NATIVE_EXCEPTION(0)
-
-  Jnjvm* vm = JavaThread::get()->getJVM();
-  array = JavaString::strToArray(obj, vm);
-  res = vm->constructString(array);
-
-  END_NATIVE_EXCEPTION
-
-  return res;
-}
-
 extern "C" JavaObject*
Java_sun_reflect_Reflection_getCallerClass__I(uint32 index) {

   JavaObject* res = 0;
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
index e0000f2..e19bf96 100644
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
@@ -165,7 +165,28 @@ JVM_Clone(JNIEnv *env, jobject obj) {
  */
 JNIEXPORT jstring JNICALL
 JVM_InternString(JNIEnv *env, jstring _str) {
-  NYI();
+  JavaString * str = *(JavaString**)_str;
+  const ArrayUInt16* array = 0;
+  JavaString * res = 0;
+  llvm_gcroot(str, 0);
+  llvm_gcroot(array, 0);
+  llvm_gcroot(res, 0);
+
+  // If already intern'd, just return.
+  if(str->getVirtualTable() == JavaString::internStringVT)
+    return _str;
+
+  BEGIN_JNI_EXCEPTION
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  array = JavaString::strToArray(str, vm);
+  res = vm->constructString(array);
+
+  RETURN_FROM_JNI((jstring)th->pushJNIRef(res))
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 /*
@@ -449,12 +470,67 @@ JVM_DisableCompiler(JNIEnv *env, jclass compCls) {
   NYI();
 }

+void start(JavaThread* thread) {
+
+  JavaObject* javaThread = NULL;
+  llvm_gcroot(javaThread, 0);
+
+  Jnjvm* vm = thread->getJVM();
+
+  // Wait some time to let the creator initialise this field
+  while (thread->javaThread == NULL) {
+    mvm::Thread::yield();
+  }
+
+  javaThread = thread->javaThread;
+  assert(javaThread && "Didn't fix the javaThread of a j3 thread");
+
+  // Ok, now that the thread is created we can set the the value of eetop
+  // which points from the javaobject to our internal JavaThread
+  vm->upcalls->eetop->setInstanceLongField(javaThread, (long)thread);
+
+  // If the thread is not a daemon, it is added to the list of threads to
+  // wait until exit.
+  bool isDaemon = vm->upcalls->daemon->getInstanceInt8Field(javaThread);
+
+  if (!isDaemon) {
+    vm->threadSystem.enter();
+  }
+
+  assert(javaThread->getVirtualTable());
+  // Run the VMThread::run function
+  vm->upcalls->runThread->invokeIntSpecial(vm,
vm->upcalls->newThread, javaThread);
+
+  // Remove the thread from the list.
+  if (!isDaemon) {
+    vm->threadSystem.leave();
+  }
+}
 /*
  * java.lang.Thread
  */
 JNIEXPORT void JNICALL
 JVM_StartThread(JNIEnv *env, jobject _thread) {
-  NYI();
+  JavaObject * thread = 0;
+  JavaThread * javaThread = 0;
+  llvm_gcroot(thread, 0);
+  llvm_gcroot(javaThread, 0);
+  BEGIN_JNI_EXCEPTION
+
+  thread = *(JavaObject**)_thread;
+  assert(thread);
+  assert(thread->getVirtualTable());
+  Jnjvm* vm = JavaThread::get()->getJVM();
+
+  JavaThread * newTh = new JavaThread(vm);
+  if (!newTh) vm->outOfMemoryError();
+  newTh->start((void (*)(mvm::Thread*))start);
+
+  newTh->initialise(thread, 0);
+
+  RETURN_VOID_FROM_JNI
+
+  END_JNI_EXCEPTION
 }

 JNIEXPORT void JNICALL
@@ -464,7 +540,20 @@ JVM_StopThread(JNIEnv *env, jobject thread,
jobject exception) {

 JNIEXPORT jboolean JNICALL
 JVM_IsThreadAlive(JNIEnv *env, jobject _thread) {
-  NYI();
+  BEGIN_JNI_EXCEPTION
+  JavaObject * thread = *(JavaObject**)_thread;
+  llvm_gcroot(thread, 0);
+  assert(thread);
+
+  Jnjvm* vm = JavaThread::get()->getJVM();
+  jint status = vm->upcalls->threadStatus->getInstanceInt32Field(thread);
+
+  // TODO: We don't actually maintain 'status'...
+  RETURN_FROM_JNI(status != 0);
+
+  END_JNI_EXCEPTION
+
+  return 0;
 }

 JNIEXPORT void JNICALL
-- 
1.7.5.1



More information about the vmkit-commits mailing list