[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