Cleaner shutdown + port unlocking for Linux. git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4303 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java b/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java index cf1dcdb..d88f483 100644 --- a/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java +++ b/dev/core/src/com/google/gwt/dev/shell/jetty/JettyLauncher.java
@@ -138,10 +138,12 @@ private final File appRootDir; private final TreeLogger logger; private final WebAppContext wac; + private final Server server; - public JettyServletContainer(TreeLogger logger, WebAppContext wac, - int actualPort, File appRootDir) { + public JettyServletContainer(TreeLogger logger, Server server, + WebAppContext wac, int actualPort, File appRootDir) { this.logger = logger; + this.server = server; this.wac = wac; this.actualPort = actualPort; this.appRootDir = appRootDir; @@ -176,7 +178,8 @@ TreeLogger branch = logger.branch(TreeLogger.INFO, "Stopping Jetty server"); try { - wac.stop(); + server.stop(); + server.setStopAtShutdown(false); } catch (Exception e) { branch.log(TreeLogger.ERROR, "Unable to stop embedded Jetty server", e); throw new UnableToCompleteException(); @@ -205,28 +208,31 @@ } } - Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(port); - connector.setHost("127.0.0.1"); - // Don't steal ports from an existing proc. + + // Don't share ports with an existing process. connector.setReuseAddress(false); + // Linux keeps the port blocked after shutdown if we don't disable this. + connector.setSoLingerTime(0); + + Server server = new Server(); server.addConnector(connector); // Create a new web app in the war directory. WebAppContext wac = new WebAppContext(appRootDir.getAbsolutePath(), "/"); - // Prevent file locking on windows; pick up file changes. + // Prevent file locking on Windows; pick up file changes. wac.getInitParams().put( "org.mortbay.jetty.servlet.Default.useFileMappedBuffer", "false"); server.setHandler(wac); - server.setStopAtShutdown(true); server.start(); + server.setStopAtShutdown(true); - return new JettyServletContainer(logger, wac, connector.getLocalPort(), - appRootDir); + return new JettyServletContainer(logger, server, wac, + connector.getLocalPort(), appRootDir); } private void checkStartParams(TreeLogger logger, int port, File appRootDir) {