summaryrefslogtreecommitdiff
path: root/libjava/java/rmi
diff options
context:
space:
mode:
authormkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-11 18:30:22 +0000
committermkoch <mkoch@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-11 18:30:22 +0000
commit4aa377371652e57a1b3050b5f30dfa079f8eaa6e (patch)
treeeee4d0ef5b246a75c1b52d7d0a19bc3e3a83da5e /libjava/java/rmi
parentad8e2d75aa3d932c40cd900bb14c5bf4d8db3537 (diff)
downloadgcc-4aa377371652e57a1b3050b5f30dfa079f8eaa6e.tar.gz
2003-10-11 Ingo Proetel <proetel@aicas.com>
* java/rmi/server/RMIClassLoader.java: Identify cached classloaders by codebase and context classloader. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72351 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/rmi')
-rw-r--r--libjava/java/rmi/server/RMIClassLoader.java73
1 files changed, 68 insertions, 5 deletions
diff --git a/libjava/java/rmi/server/RMIClassLoader.java b/libjava/java/rmi/server/RMIClassLoader.java
index c6187983eb1..57e52a363ba 100644
--- a/libjava/java/rmi/server/RMIClassLoader.java
+++ b/libjava/java/rmi/server/RMIClassLoader.java
@@ -91,6 +91,63 @@ public class RMIClassLoader
}
private final String annotation;
+ }
+
+ /**
+ * This class is used to identify a cached classloader by its codebase and
+ * the context classloader that is its parent.
+ */
+ private static class CacheKey
+ {
+ private String mCodeBase;
+ private ClassLoader mContextClassLoader;
+
+ public CacheKey (String theCodebase, ClassLoader theContextClassLoader)
+ {
+ mCodeBase = theCodebase;
+ mContextClassLoader = theContextClassLoader;
+ }
+
+ /**
+ * @return true if the codebase and the context classloader are equal
+ */
+ public boolean equals (Object theOther)
+ {
+ if (theOther != null
+ && theOther instanceof CacheKey)
+ {
+ CacheKey key = (CacheKey) theOther;
+
+ return (equals (this.mCodeBase,key.mCodeBase)
+ && equals (this.mContextClassLoader, key.mContextClassLoader));
+ }
+ return false;
+ }
+
+ /**
+ * Test if the two objects are equal or both null.
+ * @param theOne
+ * @param theOther
+ * @return
+ */
+ private boolean equals (Object theOne, Object theOther)
+ {
+ return theOne != null ? theOne.equals (theOther) : theOther == null;
+ }
+
+ /**
+ * @return hashCode
+ */
+ public int hashCode()
+ {
+ return ((mCodeBase != null ? mCodeBase.hashCode() : 0)
+ ^(mContextClassLoader != null ? mContextClassLoader.hashCode() : -1));
+ }
+
+ public String toString()
+ {
+ return "[" + mCodeBase + "," + mContextClassLoader + "]";
+ }
}
@@ -129,7 +186,9 @@ public class RMIClassLoader
{
defaultLoader = new MyClassLoader (new URL[] { defaultCodebase }, null,
defaultAnnotation);
- cacheLoaders.put(defaultAnnotation, defaultLoader);
+ cacheLoaders.put (new CacheKey (defaultAnnotation,
+ Thread.currentThread().getContextClassLoader()),
+ defaultLoader);
}
}
@@ -189,8 +248,11 @@ public class RMIClassLoader
private static ClassLoader getClassLoader (String codebases)
throws MalformedURLException
{
- ClassLoader loader = (ClassLoader) cacheLoaders.get (codebases);
-
+ ClassLoader loader;
+ CacheKey loaderKey = new CacheKey
+ (codebases, Thread.currentThread().getContextClassLoader());
+ loader = (ClassLoader) cacheLoaders.get (loaderKey);
+
if (loader == null)
{
//create an entry in cacheLoaders mapping a loader to codebases.
@@ -202,8 +264,9 @@ public class RMIClassLoader
urls.add (new URL (tok.nextToken()));
loader = new MyClassLoader ((URL[]) urls.toArray (new URL [urls.size()]),
- null, codebases);
- cacheLoaders.put (codebases, loader);
+ Thread.currentThread().getContextClassLoader(),
+ codebases);
+ cacheLoaders.put (loaderKey, loader);
}
return loader;