[388030] Restart server doesn't finish
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 ee87fa3..19d6ec0 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
@@ -375,11 +375,18 @@
public RestartJob(String launchMode) {
super(NLS.bind(Messages.jobRestarting, Server.this.getName()));
this.launchMode = launchMode;
- setRule(Server.this);
}
protected IStatus run(IProgressMonitor monitor) {
- return restartImpl(launchMode, monitor);
+ try{
+ // Do begin rule in here instead of setRule on constructor to prevent deadlock
+ // on the default restart operation during the join() in the StartJob.
+ Job.getJobManager().beginRule(Server.this, monitor);
+ return restartImpl(launchMode, monitor);
+ }
+ finally{
+ Job.getJobManager().endRule(Server.this);
+ }
}
}
@@ -3164,8 +3171,18 @@
// if restart is not implemented by the server adopter
// lets provide a default implementation
stop(false);
- start(launchMode, monitor);
-
+ ISchedulingRule curRule = null;
+ try {
+ if (((ServerType)getServerType()).synchronousStart()) {
+ curRule = Job.getJobManager().currentRule();
+ Job.getJobManager().endRule(curRule);
+ }
+ start(launchMode, monitor);
+ } finally {
+ if (curRule != null) {
+ Job.getJobManager().beginRule(curRule, monitor);
+ }
+ }
} catch (Exception e) {
if (Trace.SEVERE) {
Trace.trace(Trace.STRING_SEVERE, "Error restarting server", e);