Revision: 9539
Author: rj...@google.com
Date: Thu Jan 13 10:46:47 2011
Log: Cherry picking r9538 into releases/2.2

http://code.google.com/p/google-web-toolkit/source/detail?r=9539

Modified:
 /releases/2.2/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java

=======================================
--- /releases/2.2/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java Fri Jan 7 11:13:03 2011 +++ /releases/2.2/dev/core/src/com/google/gwt/dev/cfg/ModuleDefLoader.java Thu Jan 13 10:46:47 2011
@@ -40,6 +40,9 @@
  * The top-level API for loading module XML.
  */
 public final class ModuleDefLoader {
+  /*
+   * TODO(scottb,tobyr,zundel): synchronization????
+   */

   /**
    * Interface to provide a load strategy to the load process.
@@ -64,11 +67,12 @@

   /**
* Keep soft references to loaded modules so the VM can gc them when memory is
-   * tight.  The module's physical name is used as a key.
+ * tight. The current context class loader used as a key for modules cache.
+   * The module's physical name is used as a key inside the cache.
    */
   @SuppressWarnings("unchecked")
- private static final Map<String, ModuleDef> loadedModules = new ReferenceMap(
-      AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
+ private static final Map<ClassLoader, Map<String, ModuleDef>> loadedModulesCaches = new ReferenceMap(
+      AbstractReferenceMap.WEAK, AbstractReferenceMap.HARD);

   /**
    * A mapping from effective to physical module names.
@@ -150,8 +154,19 @@
     }
   }

+  @SuppressWarnings("unchecked")
+  private static Map<String, ModuleDef> getModulesCache() {
+ ClassLoader keyClassLoader = Thread.currentThread().getContextClassLoader();
+    Map<String, ModuleDef> cache = loadedModulesCaches.get(keyClassLoader);
+    if (cache == null) {
+ cache = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
+      loadedModulesCaches.put(keyClassLoader, cache);
+    }
+    return cache;
+  }
+
private static ModuleDef tryGetLoadedModule(String moduleName, boolean refresh) {
-    ModuleDef moduleDef = loadedModules.get(moduleName);
+    ModuleDef moduleDef = getModulesCache().get(moduleName);
     if (moduleDef == null || moduleDef.isGwtXmlFileStale()) {
       return null;
     } else if (refresh) {
@@ -301,7 +316,7 @@
     moduleNormalizeEvent.end();

     // Add the "physical" module name: com.google.Module
-    loadedModules.put(moduleName, moduleDef);
+    getModulesCache().put(moduleName, moduleDef);

     // Add a mapping from the module's effective name to its physical name
     moduleEffectiveNameToPhysicalName.put(moduleDef.getName(), moduleName);

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to