[vmkit-commits] [vmkit] r59136 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h Jnjvm.cpp Jnjvm.h JnjvmConfig.h LowerConstantCalls.cpp VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Nov 12 06:21:00 PST 2008


Author: geoffray
Date: Wed Nov 12 08:21:00 2008
New Revision: 59136

URL: http://llvm.org/viewvc/llvm-project?rev=59136&view=rev
Log:
Implement a task class mirror for an isolate environment.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h
    vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Nov 12 08:21:00 2008
@@ -279,7 +279,11 @@
   access = 0;
   ownerClass = 0;
 #if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
-  this->delegatee = 0;
+  _delegatee = 0;
+#else
+#if defined(ISOLATE)
+  memset(IsolateInfo, 0, sizeof(TaskClassMirror) * NR_ISOLATES);
+#endif
 #endif
 }
 
@@ -987,3 +991,9 @@
 void Class::resolveStaticClass() {
   classLoader->getModule()->resolveStaticClass((Class*)this);
 }
+
+#ifdef ISOLATE
+TaskClassMirror& CommonClass::getCurrentTaskClassMirror() {
+  return IsolateInfo[JavaThread::get()->isolate->IsolateID];
+}
+#endif

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Nov 12 08:21:00 2008
@@ -25,6 +25,8 @@
 #include "JavaAccess.h"
 #include "JnjvmClassLoader.h"
 
+#include "JnjvmConfig.h"
+
 namespace jnjvm {
 
 class ArrayUInt8;
@@ -117,6 +119,16 @@
   
 };
 
+
+#ifdef ISOLATE
+class TaskClassMirror {
+public:
+  JavaState status;
+  JavaObject* delegatee;
+  JavaObject* staticInstance;
+};
+#endif
+
 /// CommonClass - This class is the root class of all Java classes. It is
 /// GC-allocated because CommonClasses have to be traceable. A java/lang/Class
 /// object that stays in memory has a reference to the class. Same for
@@ -270,13 +282,7 @@
   /// classLoader - The Jnjvm class loader that loaded the class.
   ///
   JnjvmClassLoader* classLoader;
-  
-#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
-  /// delegatee - The java/lang/Class object representing this class
-  ///
-  JavaObject* delegatee;
-#endif
-  
+   
   /// virtualFields - List of all the virtual fields defined in this class.
   /// This does not contain non-redefined super fields.
   JavaField* virtualFields;
@@ -346,6 +352,14 @@
   ///
   mvm::Thread* ownerClass;
   
+  mvm::Thread* getOwnerClass() {
+    return ownerClass;
+  }
+
+  void setOwnerClass(mvm::Thread* th) {
+    ownerClass = th;
+  }
+
   /// lookupMethodDontThrow - Lookup a method in the method map of this class.
   /// Do not throw if the method is not found.
   ///
@@ -429,22 +443,7 @@
   ///
   void initialiseClass(Jnjvm* vm);
   
-
-  /// getStatus - Get the resolution/initialization status of this class.
-  ///
-  JavaState getStatus() {
-    return status;
-  }
-  /// isReady - Has this class been initialized?
-  ///
-  bool isReady() {
-    return status == ready;
-  }
-
-  bool isInitializing() {
-    return status >= inClinit;
-  }
-
+ 
   /// isResolved - Has this class been resolved?
   ///
   bool isResolved() {
@@ -480,6 +479,69 @@
     return this;
   }
 
+#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+  /// delegatee - The java/lang/Class object representing this class
+  ///
+  JavaObject* _delegatee;
+
+  JavaObject* getDelegatee() {
+    return _delegatee;
+  }
+
+  void setDelegatee(JavaObject* val) {
+    _delegatee = val;
+  }
+
+  JavaState getInitializationState() {
+    return status;
+  }
+
+  void setInitializationState(JavaState st) {
+    status = st;
+  }
+  
+  /// isReady - Has this class been initialized?
+  ///
+  bool isReady() {
+    return status == ready;
+  }
+
+  bool isInitializing() {
+    return status >= inClinit;
+  }
+
+#else
+#if defined(ISOLATE)
+  TaskClassMirror IsolateInfo[NR_ISOLATES];
+  
+  TaskClassMirror& getCurrentTaskClassMirror();
+
+  JavaState getInitializationState() {
+    return getCurrentTaskClassMirror().status;
+  }
+  
+  void setInitializationState(JavaState st) {
+    getCurrentTaskClassMirror().status = st;
+  }
+  
+  JavaObject* getDelegatee() {
+    return getCurrentTaskClassMirror().delegatee;
+  }
+
+  void setDelegatee(JavaObject* val) {
+    getCurrentTaskClassMirror().delegatee = val;
+  }
+  
+  bool isReady() {
+    return getCurrentTaskClassMirror().status == ready;
+  }
+
+  bool isInitializing() {
+    return getCurrentTaskClassMirror().status >= inClinit;
+  }
+#endif
+#endif
+
 };
 
 /// ClassPrimitive - This class represents internal classes for primitive
@@ -513,7 +575,7 @@
   Attribut* attributs;
   uint16 nbAttributs;
  
-#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+#if !defined(ISOLATE_SHARING)
   /// innerClasses - The inner classes of this class.
   ///
   Class** innerClasses;
@@ -600,6 +662,17 @@
   void setStaticInstance(JavaObject* val) {
     _staticInstance = val;
   }
+#else
+#if defined(ISOLATE)
+  JavaObject* getStaticInstance() {
+    return getCurrentTaskClassMirror().staticInstance;
+  }
+
+  void setStaticInstance(JavaObject* val) {
+    getCurrentTaskClassMirror().staticInstance = val;
+  }
+
+#endif
 #endif
 
   

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Nov 12 08:21:00 2008
@@ -68,10 +68,10 @@
   //    verification step failed or because initialization was attempted and
   //    failed.
 
-  assert(status >= resolved || ownerClass || status == ready ||
+  assert(status >= resolved || getOwnerClass() || status == ready ||
          status == erroneous && "Class in wrong state");
   
-  if (status != ready) {
+  if (getInitializationState() != ready) {
     
     // 1. Synchronize on the Class object that represents the class or 
     //    interface to be initialized. This involves waiting until the
@@ -80,13 +80,13 @@
     acquire();
     mvm::Thread* self = mvm::Thread::get();
 
-    if (status == inClinit) {
+    if (getInitializationState() == inClinit) {
       // 2. If initialization by some other thread is in progress for the
       //    class or interface, then wait on this Class object (which 
       //    temporarily releases the lock). When the current thread awakens
       //    from the wait, repeat this step.
-      if (ownerClass != self) {
-        while (ownerClass) {
+      if (getOwnerClass() != self) {
+        while (getOwnerClass()) {
           waitClass();
         }
       } else {
@@ -102,7 +102,7 @@
     // 4. If the class or interface has already been initialized, then no 
     //    further action is required. Release the lock on the Class object
     //    and complete normally.
-    if (status == ready) {
+    if (getInitializationState() == ready) {
       release();
       return;
     }
@@ -118,8 +118,8 @@
     // 6. Otherwise, record the fact that initialization of the Class object is
     //    now in progress by the current thread and release the lock on the
     //    Class object.
-    ownerClass = self;
-    status = inClinit;
+    setOwnerClass(self);
+    setInitializationState(inClinit);
     release();
   
 
@@ -145,7 +145,7 @@
       if (exc) {
         acquire();
         status = erroneous;
-        ownerClass = 0;
+        setOwnerClass(0);
         broadcastClass();
         release();
         throw exc;
@@ -200,8 +200,8 @@
     //    threads, release the lock, and complete this procedure normally.
     if (!exc) {
       acquire();
-      status = ready;
-      ownerClass = 0;
+      setInitializationState(ready);
+      setOwnerClass(0);
       broadcastClass();
       release();
       return;
@@ -234,7 +234,7 @@
     //     with reason E or its replacement as determined in the previous step.
     acquire();
     status = erroneous;
-    ownerClass = 0;
+    setOwnerClass(0);
     broadcastClass();
     release();
     throw exc;
@@ -429,7 +429,7 @@
 
 JavaObject* UserCommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) {
   acquire();
-  if (!(delegatee)) {
+  if (!getDelegatee()) {
     UserClass* cl = vm->upcalls->newClass;
     JavaObject* delegatee = cl->doNew(vm);
     if (!pd) {
@@ -439,10 +439,10 @@
                                                                    delegatee,
                                                                    this, pd);
     }
-    this->delegatee = delegatee;
+    setDelegatee(delegatee);
   }
   release();
-  return delegatee;
+  return getDelegatee();
 }
 
 #define PATH_MANIFEST "META-INF/MANIFEST.MF"

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Wed Nov 12 08:21:00 2008
@@ -322,7 +322,11 @@
   /// waitForExit - Waits that there are no more non-daemon threads in this JVM.
   ///
   virtual void waitForExit();
-  
+
+#ifdef ISOLATE
+  uint32 IsolateID;
+#endif
+
 };
 
 } // end namespace jnjvm

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmConfig.h Wed Nov 12 08:21:00 2008
@@ -33,4 +33,9 @@
 #define ISOLATE_STATIC static
 #endif
 
+
+#ifdef ISOLATE
+#define NR_ISOLATES 32
+#endif
+
 #endif // JNJVM_CONFIG_H

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Nov 12 08:21:00 2008
@@ -229,7 +229,9 @@
           }
         } else if (V == module->InitialisationCheckFunction) {
           Changed = true;
-          
+#ifdef ISOLATE
+          Call.setCalledFunction(module->InitialiseClassFunction);
+#else
           BasicBlock* NBB = 0;
           if (CI->getParent()->getTerminator() != CI) {
             NBB = II->getParent()->splitBasicBlock(II);
@@ -302,6 +304,7 @@
           CI->eraseFromParent();
           BranchInst::Create(NBB, trueCl);
           break;
+#endif
         } else if (V == module->GetConstantPoolAtFunction) {
           Function* resolver = dyn_cast<Function>(Call.getArgument(0));
           assert(resolver && "Wrong use of GetConstantPoolAt");

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Wed Nov 12 08:21:00 2008
@@ -75,8 +75,16 @@
     }
   }
   classLoader->MARK_AND_TRACE;
-#if !defined(ISOLATE)
-  delegatee->MARK_AND_TRACE;
+#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+  _delegatee->MARK_AND_TRACE;
+#endif
+
+#if defined(ISOLATE)
+  for (uint32 i =0; i < NR_ISOLATES; ++i) {
+    TaskClassMirror &M = IsolateInfo[i];
+    M.delegatee->MARK_AND_TRACE;
+    M.staticInstance->MARK_AND_TRACE;
+  }
 #endif
 }
 
@@ -129,8 +137,16 @@
 #endif
   traceClassMap(bootstrapLoader->classes);
   
+#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+#define TRACE_DELEGATEE(prim) \
+  prim->_delegatee->MARK_AND_TRACE
+
+#else
+#if defined(ISOLATE)
 #define TRACE_DELEGATEE(prim) \
-  prim->delegatee->MARK_AND_TRACE
+  prim->CALL_TRACER;
+#endif
+#endif
 
   TRACE_DELEGATEE(upcalls->OfVoid);
   TRACE_DELEGATEE(upcalls->OfBool);
@@ -142,7 +158,7 @@
   TRACE_DELEGATEE(upcalls->OfLong);
   TRACE_DELEGATEE(upcalls->OfDouble);
 #undef TRACE_DELEGATEE
-  
+
   TRACE_VECTOR(JavaString*, gc_allocator, bootstrapLoader->strings);
 
   if (bootstrapThread) {





More information about the vmkit-commits mailing list