[vmkit-commits] [vmkit] r145761 - in /vmkit/trunk/lib/j3/ClassLib/OpenJDK: JavaUpcalls.cpp JavaUpcalls.h
Will Dietz
wdietz2 at illinois.edu
Sat Dec 3 01:01:30 PST 2011
Author: wdietz2
Date: Sat Dec 3 03:01:29 2011
New Revision: 145761
URL: http://llvm.org/viewvc/llvm-project?rev=145761&view=rev
Log:
Override j.l.Reference's clinit--it wants to spawn a thread too early on.
This lays groundwork for using References earlier in the bootstrap sequence,
in particular to let us use a a Classpath-based WeakHashMap String intern
implementation.
Modified:
vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp
vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
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=145761&r1=145760&r2=145761&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.cpp Sat Dec 3 03:01:29 2011
@@ -221,6 +221,12 @@
JavaMethod* Classpath::EnqueueReference;
Class* Classpath::newReference;
JavaField* Classpath::NullRefQueue;
+JavaField* Classpath::RefLock;
+Class* Classpath::newRefLock;
+JavaField* Classpath::RefPending;
+Class* Classpath::RefHandlerClass;
+JavaMethod* Classpath::initRefHandler;
+JavaMethod* Classpath::threadStart;
void Classpath::CreateJavaThread(Jnjvm* vm, JavaThread* myth,
const char* thName, JavaObject* Group) {
@@ -259,11 +265,20 @@
JavaObject* systemName = 0;
JavaObject* MainGroup = 0;
JavaObject* mainName = 0;
+ JavaObject* RefHandler = 0;
+ JavaObject* RefHandlerName = 0;
llvm_gcroot(RG, 0);
llvm_gcroot(SystemGroup, 0);
llvm_gcroot(systemName, 0);
llvm_gcroot(MainGroup, 0);
llvm_gcroot(mainName, 0);
+ llvm_gcroot(RefHandler, 0);
+ llvm_gcroot(RefHandlerName, 0);
+
+ newRefLock->resolveClass();
+ newRefLock->initialiseClass(vm);
+ RefHandlerClass->resolveClass();
+ RefHandlerClass->initialiseClass(vm);
// Resolve and initialize classes first.
newThread->resolveClass();
@@ -292,6 +307,15 @@
// Create the enqueue thread.
assert(vm->getReferenceThread() && "VM did not set its enqueue thread");
CreateJavaThread(vm, vm->getReferenceThread(), "Reference", SystemGroup);
+
+ // Create the ReferenceHandler thread.
+ RefHandler = RefHandlerClass->doNew(vm);
+ RefHandlerName = vm->asciizToStr("Reference Handler");
+ initRefHandler->invokeIntSpecial(vm, RefHandlerClass, RefHandler,
+ &SystemGroup, &RefHandlerName);
+ priority->setInstanceInt32Field(RefHandler, 10); // MAX_PRIORITY
+ daemon->setInstanceInt8Field(RefHandler, (uint32)true);
+ threadStart->invokeIntVirtual(vm, RefHandlerClass, RefHandler);
}
extern "C" void Java_java_lang_ref_WeakReference__0003Cinit_0003E__Ljava_lang_Object_2(
@@ -410,6 +434,23 @@
return res;
}
+// The OpenJDK Reference clinit spawns a Thread!
+// We split that functionality out until we have threading working.
+extern "C" void Java_java_lang_ref_Reference__0003Cclinit_0003E() {
+ JavaObject* lock = 0;
+ llvm_gcroot(lock, 0);
+ BEGIN_NATIVE_EXCEPTION(0)
+ Jnjvm* vm = JavaThread::get()->getJVM();
+
+ // Initialize the static fields of this class, skip
+ // the spawning of the reference queue thread.
+ lock = vm->upcalls->newRefLock->doNew(vm);
+ vm->upcalls->RefLock->setStaticObjectField(lock);
+ vm->upcalls->RefPending->setStaticObjectField(NULL);
+
+ END_NATIVE_EXCEPTION
+}
+
extern "C" void nativeJavaObjectClassTracer(
JavaObjectClass* obj, word_t closure) {
JavaObjectClass::staticTracer(obj, closure);
@@ -847,6 +888,23 @@
newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
+ RefLock = UPCALL_FIELD(loader, "java/lang/ref/Reference",
+ "lock", "Ljava/lang/ref/Reference$Lock;", ACC_STATIC);
+ RefPending = UPCALL_FIELD(loader, "java/lang/ref/Reference",
+ "pending", "Ljava/lang/ref/Reference;", ACC_STATIC);
+
+ newRefLock = UPCALL_CLASS(loader, "java/lang/ref/Reference$Lock");
+
+ RefHandlerClass =
+ UPCALL_CLASS(loader, "java/lang/ref/Reference$ReferenceHandler");
+ initRefHandler =
+ UPCALL_METHOD(loader, "java/lang/ref/Reference$ReferenceHandler", "<init>",
+ "(Ljava/lang/ThreadGroup;Ljava/lang/String;)V", ACC_VIRTUAL);
+
+ threadStart =
+ UPCALL_METHOD(loader, "java/lang/Thread", "start",
+ "()V", ACC_VIRTUAL);
+
EnqueueReference =
UPCALL_METHOD(loader, "java/lang/ref/Reference", "enqueue", "()Z",
ACC_VIRTUAL);
@@ -884,6 +942,11 @@
"(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V",
ACC_VIRTUAL);
initPhantomReference->setNative();
+
+ JavaMethod * ReferenceClassInit =
+ UPCALL_METHOD(loader, "java/lang/ref/Reference", "<clinit>",
+ "()V", ACC_STATIC);
+ ReferenceClassInit->setNative();
}
void Classpath::InitializeSystem(Jnjvm * jvm) {
Modified: vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h?rev=145761&r1=145760&r2=145761&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/JavaUpcalls.h Sat Dec 3 03:01:29 2011
@@ -257,8 +257,14 @@
ISOLATE_STATIC JavaField* constructorClass;
ISOLATE_STATIC JavaMethod* EnqueueReference;
- ISOLATE_STATIC Class* newReference;
+ ISOLATE_STATIC UserClass* newReference;
ISOLATE_STATIC JavaField* NullRefQueue;
+ ISOLATE_STATIC JavaField* RefLock;
+ ISOLATE_STATIC UserClass* newRefLock;
+ ISOLATE_STATIC JavaField* RefPending;
+ ISOLATE_STATIC UserClass* RefHandlerClass;
+ ISOLATE_STATIC JavaMethod* initRefHandler;
+ ISOLATE_STATIC JavaMethod* threadStart;
ISOLATE_STATIC UserClass* EnumClass;
More information about the vmkit-commits
mailing list