Reviewers: rice+legacy, Description: Hi Dan, small review: this is what I was getting at about merging the module pinning and "no refresh on first load" together.
Please review this at http://gwt-code-reviews.appspot.com/106805 Affected files: dev/core/src/com/google/gwt/dev/DevMode.java dev/core/src/com/google/gwt/dev/DevModeBase.java Index: dev/core/src/com/google/gwt/dev/DevMode.java --- dev/core/src/com/google/gwt/dev/DevMode.java (revision 7037) +++ dev/core/src/com/google/gwt/dev/DevMode.java (working copy) @@ -38,6 +38,8 @@ import com.google.gwt.util.tools.Utility; import java.io.File; import java.io.IOException; import java.net.BindException; +import java.util.HashMap; +import java.util.Map; /** * The main executable class for the hosted mode shell. NOTE: the public API for @@ -254,6 +256,8 @@ public class DevMode extends DevModeBase implements RestartServerCallback { */ private ServletContainer server; + private final Map<String, ModuleDef> startupModules = new HashMap<String, ModuleDef>(); + /** * Tracks whether we created a temp workdir that we need to destroy. */ @@ -379,6 +383,16 @@ public class DevMode extends DevModeBase implements RestartServerCallback { } @Override + protected ModuleDef loadModule(TreeLogger logger, String moduleName, + boolean refresh) throws UnableToCompleteException { + if (startupModules.containsKey(moduleName)) { + // First load of a startup module; remove from list, no need to refresh. + return startupModules.remove(moduleName); + } + return super.loadModule(logger, moduleName, refresh); + } + + @Override protected synchronized void produceOutput(TreeLogger logger, StandardLinkerContext linkerStack, ArtifactSet artifacts, ModuleDef module, boolean isRelink) throws UnableToCompleteException { Index: dev/core/src/com/google/gwt/dev/DevModeBase.java --- dev/core/src/com/google/gwt/dev/DevModeBase.java (revision 7037) +++ dev/core/src/com/google/gwt/dev/DevModeBase.java (working copy) @@ -54,11 +54,9 @@ import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; -import java.util.Set; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicLong; @@ -97,8 +95,6 @@ abstract class DevModeBase implements DoneCallback { // Try to find an existing loaded version of the module def. ModuleDef moduleDef = loadModule(logger, moduleName, true); assert (moduleDef != null); - // Release the hard reference to the module if it is present. - startupModules.remove(moduleDef.getName()); ShellModuleSpaceHost host = doCreateShellModuleSpaceHost(logger, moduleDef.getCompilationState(logger), moduleDef); @@ -570,8 +566,6 @@ abstract class DevModeBase implements DoneCallback { } } - protected static final Map<String, ModuleDef> startupModules = new HashMap<String, ModuleDef>(); - private static final Random RNG = new Random(); private static final AtomicLong uniqueId = new AtomicLong(); @@ -650,14 +644,6 @@ abstract class DevModeBase implements DoneCallback { protected DevModeUI ui = null; - /** - * Cheat on the first load's refresh by assuming the module loaded by - * {...@link com.google.gwt.dev.shell.GWTShellServlet} is still fresh. This - * prevents a double-refresh on startup. Subsequent refreshes will trigger a - * real refresh. - */ - private Set<String> alreadySeenModules = new HashSet<String>(); - private final Semaphore blockUntilDone = new Semaphore(0); private BrowserWidgetHost browserHost = new UiBrowserWidgetHostImpl(); @@ -883,10 +869,8 @@ abstract class DevModeBase implements DoneCallback { */ protected ModuleDef loadModule(TreeLogger logger, String moduleName, boolean refresh) throws UnableToCompleteException { - refresh &= alreadySeenModules.contains(moduleName); ModuleDef moduleDef = ModuleDefLoader.loadFromClassPath(logger, moduleName, refresh); - alreadySeenModules.add(moduleName); assert (moduleDef != null) : "Required module state is absent"; return moduleDef; } -- http://groups.google.com/group/Google-Web-Toolkit-Contributors
