[vmkit-commits] [vmkit] r145474 - in /vmkit/trunk/lib/j3: ClassLib/OpenJDK/OpenJDK.inc VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h

Will Dietz wdietz2 at illinois.edu
Tue Nov 29 19:52:33 PST 2011


Author: wdietz2
Date: Tue Nov 29 21:52:33 2011
New Revision: 145474

URL: http://llvm.org/viewvc/llvm-project?rev=145474&view=rev
Log:
Touchup ClassLoader class-caching policies.

Essentially, if a class is loaded by a call to a particular classloader it
should be cached there.

Modified:
    vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h

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=145474&r1=145473&r2=145474&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc (original)
+++ vmkit/trunk/lib/j3/ClassLib/OpenJDK/OpenJDK.inc Tue Nov 29 21:52:33 2011
@@ -1312,8 +1312,7 @@
   CommonClass * Cl = 0;
 
   JCL = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader, vm);
-  if (JCL)
-   Cl = JCL->lookupClassFromJavaString(str);
+  Cl = JCL->lookupClassFromJavaString(str);
   jclass res = Cl ? (jclass)Cl->getClassDelegateePtr(vm) : 0;
   RETURN_FROM_JNI(res);
 

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp?rev=145474&r1=145473&r2=145474&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.cpp Tue Nov 29 21:52:33 2011
@@ -344,6 +344,12 @@
     vm->noClassDefFoundError(name);
   }
 
+  ensureCached(cl);
+
+  return cl;
+}
+
+void JnjvmClassLoader::ensureCached(UserCommonClass* cl) {
   if (cl && cl->classLoader != this) {
     classes->lock.lock();
     ClassMap::iterator End = classes->map.end();
@@ -352,8 +358,6 @@
       classes->map.insert(std::make_pair(cl->name, cl));
     classes->lock.unlock();
   }
-
-  return cl;
 }
 
 
@@ -414,6 +418,7 @@
 
   if (this != bootstrapLoader) {
     temp = bootstrapLoader->lookupClassOrArray(name);
+    ensureCached(temp);
     if (temp) return temp;
   }
   
@@ -450,6 +455,7 @@
     if (prim) return constructArray(name);
     if (componentName) {
       UserCommonClass* temp = loadName(componentName, doResolve, doThrow, NULL);
+      ensureCached(temp);
       if (temp) return constructArray(name);
     }
   } else {
@@ -464,7 +470,6 @@
                                                        bool doThrow) {
   const UTF8* name = hashUTF8->lookupAsciiz(asciiz);
   vmkit::ThreadAllocator threadAllocator;
-  UserCommonClass* result = NULL;
   if (!name) name = bootstrapLoader->hashUTF8->lookupAsciiz(asciiz);
   if (!name) {
     uint32 size = strlen(asciiz);
@@ -478,16 +483,6 @@
     name = temp;
   }
   
-  result = lookupClass(name);
-  if ((result == NULL) && (this != bootstrapLoader)) {
-    result = bootstrapLoader->lookupClassOrArray(name);
-    if (result != NULL) {
-      if (result->isClass() && doResolve) {
-        result->asClass()->resolveClass();
-      }
-      return result;
-    }
-  }
  
   return loadClassFromUserUTF8(name, doResolve, doThrow, NULL);
 }
@@ -496,36 +491,22 @@
 UserCommonClass* 
 JnjvmClassLoader::loadClassFromJavaString(JavaString* str, bool doResolve,
                                           bool doThrow) {
-  
+
   llvm_gcroot(str, 0);
   vmkit::ThreadAllocator allocator; 
   UTF8* name = (UTF8*)allocator.Allocate(sizeof(UTF8) + str->count * sizeof(uint16));
- 
+
   name->size = str->count;
-  if (ArrayUInt16::getElement(JavaString::getValue(str), str->offset) != I_TAB) {
-    for (sint32 i = 0; i < str->count; ++i) {
-      uint16 cur = ArrayUInt16::getElement(JavaString::getValue(str), str->offset + i);
-      if (cur == '.') name->elements[i] = '/';
-      else if (cur == '/') {
-        return 0;
-      }
-      else name->elements[i] = cur;
-    }
-  } else {
-    for (sint32 i = 0; i < str->count; ++i) {
-      uint16 cur = ArrayUInt16::getElement(JavaString::getValue(str), str->offset + i);
-      if (cur == '.') {
-        name->elements[i] = '/';
-      } else if (cur == '/') {
-        return 0;
-      } else {
-        name->elements[i] = cur;
-      }
+  for (sint32 i = 0; i < str->count; ++i) {
+    uint16 cur = ArrayUInt16::getElement(JavaString::getValue(str), str->offset + i);
+    if (cur == '.') name->elements[i] = '/';
+    else if (cur == '/') {
+      return 0;
     }
+    else name->elements[i] = cur;
   }
-    
-  UserCommonClass* cls = loadClassFromUserUTF8(name, doResolve, doThrow, str);
-  return cls;
+
+  return loadClassFromUserUTF8(name, doResolve, doThrow, str);
 }
 
 UserCommonClass* JnjvmClassLoader::lookupClassFromJavaString(JavaString* str) {
@@ -585,15 +566,8 @@
   assert(cl && "no base class for an array");
   JnjvmClassLoader* ld = cl->classLoader;
   res = ld->constructArray(name, cl);
-  
-  if (res && res->classLoader != this) {
-    classes->lock.lock();
-    ClassMap::iterator End = classes->map.end();
-    ClassMap::iterator I = classes->map.find(res->name);
-    if (I == End)
-      classes->map.insert(std::make_pair(res->name, res));
-    classes->lock.unlock();
-  }
+
+  ensureCached(res);
   return res;
 }
 

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=145474&r1=145473&r2=145474&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Tue Nov 29 21:52:33 2011
@@ -84,6 +84,10 @@
   ///
   const UTF8* lookupComponentName(const UTF8* name, UTF8* holder, bool& prim);
 
+
+  /// ensureCached - Make sure the specified class is in our classes map
+  ///
+  void ensureCached(UserCommonClass* cl);
 protected:
   
   JnjvmClassLoader(vmkit::BumpPtrAllocator& Alloc) : allocator(Alloc) {}





More information about the vmkit-commits mailing list