[377566] The server timeout timer begins at the incorrect time
diff --git a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
index 820f97b..ee87fa3 100644
--- a/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
+++ b/plugins/org.eclipse.wst.server.core/servercore/org/eclipse/wst/server/core/internal/Server.java
@@ -3267,8 +3267,6 @@
}
}
};
- thread.setDaemon(true);
- thread.start();
if (Trace.FINEST) {
Trace.trace(Trace.STRING_FINEST, "synchronousRestart 2");
@@ -3277,6 +3275,9 @@
// call the delegate restart
try {
getBehaviourDelegate(null).restart(launchMode);
+
+ thread.setDaemon(true);
+ thread.start();
} catch (CoreException e) {
removeServerListener(listener);
timer.alreadyDone = true;
@@ -3409,8 +3410,6 @@
}
}
};
- thread.setDaemon(true);
- thread.start();
if (Trace.FINEST) {
Trace.trace(Trace.STRING_FINEST, "synchronousStart 2");
@@ -3419,9 +3418,11 @@
// start the server
try {
startImpl2(launchMode, monitor);
+
+ thread.setDaemon(true);
+ thread.start();
} catch (CoreException e) {
removeServerListener(listener);
- timer.alreadyDone = true;
return e.getStatus();
}
if (monitor.isCanceled()) {
@@ -3532,11 +3533,23 @@
final Timer timer = new Timer();
final int serverTimeout = getStopTimeout() * 1000;
+ Thread thread = null;
if (serverTimeout > 0) {
- Thread thread = new Thread("Server Stop Timeout") {
+ thread = new Thread("Server Stop Timeout") {
public void run() {
try {
- Thread.sleep(serverTimeout);
+ int totalTimeout = serverTimeout;
+ if (totalTimeout < 0)
+ totalTimeout = 1;
+
+ int retryPeriod = 1000;
+
+ while (totalTimeout > 0 && !timer.alreadyDone){
+ Thread.sleep(retryPeriod);
+ if (serverTimeout > 0)
+ totalTimeout -= retryPeriod;
+ }
+
if (!timer.alreadyDone) {
timer.timeout = true;
// notify waiter
@@ -3554,13 +3567,16 @@
}
}
};
- thread.setDaemon(true);
- thread.start();
}
// stop the server
stopImpl2(force);
+ if (thread != null){
+ thread.setDaemon(true);
+ thread.start();
+ }
+
// wait for it! wait for it!
synchronized (mutex) {
try {
@@ -3572,6 +3588,7 @@
Trace.trace(Trace.STRING_SEVERE, "Error waiting for server stop", e);
}
}
+ timer.alreadyDone = true;
}
removeServerListener(listener);