[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