[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