[vmkit-commits] [vmkit] r69966 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaUpcalls.cpp JavaUpcalls.h Jnjvm.cpp Jnjvm.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Apr 24 04:31:36 PDT 2009


Author: geoffray
Date: Fri Apr 24 06:30:54 2009
New Revision: 69966

URL: http://llvm.org/viewvc/llvm-project?rev=69966&view=rev
Log:
Factorize code for thread initialization.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=69966&r1=69965&r2=69966&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Fri Apr 24 06:30:54 2009
@@ -207,38 +207,43 @@
 
 #endif
 
-void Classpath::createInitialThread(Jnjvm* vm, JavaObject* th) {
-  JnjvmClassLoader* JCL = vm->bootstrapLoader;
-  JCL->loadName(newVMThread->getName(), true, true);
-  newVMThread->initialiseClass(vm);
+void Classpath::CreateJavaThread(Jnjvm* vm, JavaThread* myth,
+                                 const char* thName, JavaObject* Group) {
 
+  JavaObject* th = newThread->doNew(vm);
+  myth->javaThread = th;
   JavaObject* vmth = newVMThread->doNew(vm);
-  name->setObjectField(th, (JavaObject*)vm->asciizToStr("main"));
+  
+  name->setObjectField(th, (JavaObject*)vm->asciizToStr(thName));
   priority->setInt32Field(th, (uint32)1);
   daemon->setInt8Field(th, (uint32)0);
   vmThread->setObjectField(th, vmth);
   assocThread->setObjectField(vmth, th);
   running->setInt8Field(vmth, (uint32)1);
+  vmdataVMThread->setObjectField(vmth, (JavaObject*)myth);
   
-  JCL->loadName(threadGroup->getName(), true, true);
-  threadGroup->initialiseClass(vm);
-  void* Stat = threadGroup->getStaticInstance();
-  JavaObject* RG = rootGroup->getObjectField(Stat);
-  group->setObjectField(th, RG);
-  groupAddThread->invokeIntSpecial(vm, threadGroup, RG, th);
+  group->setObjectField(th, Group);
+  groupAddThread->invokeIntSpecial(vm, threadGroup, Group, th);
+  
+  finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th);
 }
 
-void Classpath::mapInitialThread(Jnjvm* vm) {
-  JnjvmClassLoader* JCL = vm->bootstrapLoader;
-  JCL->loadName(newThread->getName(), true, true);
+void Classpath::InitializeThreading(Jnjvm* vm) {
+  // Resolve and initialize classes first.
+  newThread->resolveClass();
   newThread->initialiseClass(vm);
-  JavaObject* th = newThread->doNew(vm);
-  createInitialThread(vm, th);
-  JavaThread* myth = JavaThread::get();
-  myth->javaThread = th;
-  JavaObject* vmth = vmThread->getObjectField(th);
-  vmdataVMThread->setObjectField(vmth, (JavaObject*)myth);
-  finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th);
+  
+  newVMThread->resolveClass();
+  newVMThread->initialiseClass(vm);
+  
+  threadGroup->resolveClass();
+  threadGroup->initialiseClass(vm);
+
+  // Create the main thread
+  void* Stat = threadGroup->getStaticInstance();
+  JavaObject* RG = rootGroup->getObjectField(Stat);
+  assert(vm->getBootstrapThread() && "VM did not set its bootstrap thread");
+  CreateJavaThread(vm, vm->getBootstrapThread(), "main", RG);
 }
 
 extern "C" JavaString* nativeInternString(JavaString* obj) {

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=69966&r1=69965&r2=69966&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Fri Apr 24 06:30:54 2009
@@ -213,8 +213,6 @@
   ISOLATE_STATIC JavaMethod* ErrorWithExcpExceptionInInitializerError;
   ISOLATE_STATIC JavaMethod* ErrorWithExcpInvocationTargetException;
   
-  ISOLATE_STATIC void createInitialThread(Jnjvm* vm, JavaObject* th);
-  ISOLATE_STATIC void mapInitialThread(Jnjvm* vm);
   
 
   ISOLATE_STATIC UserClassArray* ArrayOfByte;
@@ -241,6 +239,13 @@
   ISOLATE_STATIC JavaField* methodClass;
   ISOLATE_STATIC JavaField* fieldClass;
   ISOLATE_STATIC JavaField* constructorClass;
+  
+private:
+  ISOLATE_STATIC void CreateJavaThread(Jnjvm* vm, JavaThread* myth,
+                                       const char* name, JavaObject* Group);
+
+public:
+  ISOLATE_STATIC void InitializeThreading(Jnjvm* vm);
 };
 
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=69966&r1=69965&r2=69966&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Apr 24 06:30:54 2009
@@ -786,10 +786,6 @@
   return appClassLoader;
 }
 
-void Jnjvm::mapInitialThread() {
-  upcalls->mapInitialThread(this);
-}
-
 void Jnjvm::loadBootstrap() {
   JnjvmClassLoader* loader = bootstrapLoader;
   
@@ -851,7 +847,7 @@
 #endif
   // The initialization code of the classes initialized below may require
   // to get the Java thread, so we create the Java thread object first.
-  mapInitialThread();
+  upcalls->InitializeThreading(this);
   
   LOAD_CLASS(upcalls->newStackTraceElement);
   LOAD_CLASS(upcalls->newVMThrowable);

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=69966&r1=69965&r2=69966&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Fri Apr 24 06:30:54 2009
@@ -137,11 +137,6 @@
   ///
   JnjvmClassLoader* loadAppClassLoader();
   
-  /// mapInitialThread - Maps the initial native thread to a java/lang/Thread
-  /// object.
-  ///
-  void mapInitialThread();
-
   /// loadBootstrap - Bootstraps the JVM, getting the class loader, initializing
   /// bootstrap classes (e.g. java/lang/Class, java/lang/*Exception) and
   /// mapping the initial thread.
@@ -307,6 +302,10 @@
   /// setBootstrapThread - Set the bootstrap thread of this VM.
   ///
   void setBootstrapThread(JavaThread* th) { bootstrapThread = th; }
+  
+  /// getBootstrapThread - Get the bootstrap thread of this VM.
+  ///
+  JavaThread* getBootstrapThread() const { return bootstrapThread; }
 
   /// ~Jnjvm - Destroy the JVM.
   ///





More information about the vmkit-commits mailing list