[vmkit-commits] [vmkit] r143484 - in /vmkit/trunk/lib/J3/ClassLib/OpenJDK: JavaUpcalls.cpp OpenJDK.inc

Will Dietz wdietz2 at illinois.edu
Tue Nov 1 13:06:15 PDT 2011


Author: wdietz2
Date: Tue Nov  1 15:06:15 2011
New Revision: 143484

URL: http://llvm.org/viewvc/llvm-project?rev=143484&view=rev
Log:
Impl JVM_InternString, JVM_StartThread, JVM_IsThreadAlive

Modified:
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
    vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc

Modified: vmkit/trunk/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp?rev=143484&r1=143483&r2=143484&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/JavaUpcalls.cpp Tue Nov  1 15:06:15 2011
@@ -367,27 +367,6 @@
   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;

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=143484&r1=143483&r2=143484&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/J3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov  1 15:06:15 2011
@@ -165,7 +165,28 @@
  */
 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;
 }
 
 /*
@@ -450,12 +471,67 @@
   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
@@ -465,7 +541,20 @@
 
 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





More information about the vmkit-commits mailing list