From 0fdd32231eac08d7985c3e638c4c73613e5b6ba8 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 1 Feb 2012 12:01:55 +0100 Subject: [PATCH] -terminate automake session when project is disposed -server side: cancel compile session when connection is closed --- .../compiler/CompileServerManager.java | 6 +++ .../jps/server/ServerMessageHandler.java | 38 +++++++++++++------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java index d2862e6289ea..2e5f1dff1219 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompileServerManager.java @@ -673,6 +673,9 @@ public class CompileServerManager implements ApplicationComponent{ @Override public boolean handleBuildEvent(JpsRemoteProto.Message.Response.BuildEvent event) { + if (myProject.isDisposed()) { + return true; + } switch (event.getEventType()) { case BUILD_COMPLETED: if (event.hasCompletionStatus()) { @@ -696,6 +699,9 @@ public class CompileServerManager implements ApplicationComponent{ @Override public void handleCompileMessage(JpsRemoteProto.Message.Response.CompileMessage compileResponse) { + if (myProject.isDisposed()) { + return; + } final JpsRemoteProto.Message.Response.CompileMessage.Kind kind = compileResponse.getKind(); if (kind == JpsRemoteProto.Message.Response.CompileMessage.Kind.ERROR) { informWolf(myProject, compileResponse); diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java b/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java index 0b49fee14964..5afd8908e8f8 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java +++ b/jps/jps-builders/src/org/jetbrains/jps/server/ServerMessageHandler.java @@ -63,18 +63,7 @@ class ServerMessageHandler extends SimpleChannelHandler { case CANCEL_BUILD_COMMAND: final JpsRemoteProto.Message.Request.CancelBuildCommand cancelCommand = request.getCancelBuildCommand(); final UUID targetSessionId = ProtoUtil.fromProtoUUID(cancelCommand.getTargetSessionId()); - synchronized (myBuildsInProgress) { - for (Iterator> it = myBuildsInProgress.iterator(); it.hasNext(); ) { - final Pair pair = it.next(); - final CompilationTask task = pair.second; - if (task.getSessionId().equals(targetSessionId)) { - it.remove(); - task.cancel(); - pair.first.cancel(true); - break; - } - } - } + cancelSession(targetSessionId); reply = ProtoUtil.toMessage(sessionId, ProtoUtil.createCommandCompletedEvent(null)); break; case SETUP_COMMAND: @@ -158,6 +147,30 @@ class ServerMessageHandler extends SimpleChannelHandler { } } + private void cancelSession(UUID targetSessionId) { + synchronized (myBuildsInProgress) { + for (Iterator> it = myBuildsInProgress.iterator(); it.hasNext(); ) { + final Pair pair = it.next(); + final CompilationTask task = pair.second; + if (task.getSessionId().equals(targetSessionId)) { + it.remove(); + task.cancel(); + pair.first.cancel(true); + break; + } + } + } + } + + @Override + public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { + final Object attachment = ctx.getAttachment(); + if (attachment instanceof UUID) { + cancelSession((UUID)attachment); + } + super.channelDisconnected(ctx, e); + } + @Nullable private JpsRemoteProto.Message startBuild(UUID sessionId, final ChannelHandlerContext channelContext, JpsRemoteProto.Message.Request.CompilationRequest compileRequest) { if (!compileRequest.hasProjectId()) { @@ -172,6 +185,7 @@ class ServerMessageHandler extends SimpleChannelHandler { case MAKE: case FORCED_COMPILATION: case REBUILD: { + channelContext.setAttachment(sessionId); final BuildType buildType = convertCompileType(compileType); final CompilationTask task = new CompilationTask( sessionId, channelContext, projectId, buildType, compileRequest.getModuleNameList(), compileRequest.getFilePathList()