@Override
public boolean handleBuildEvent(JpsRemoteProto.Message.Response.BuildEvent event) {
+ if (myProject.isDisposed()) {
+ return true;
+ }
switch (event.getEventType()) {
case BUILD_COMPLETED:
if (event.hasCompletionStatus()) {
@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);
case CANCEL_BUILD_COMMAND:
final JpsRemoteProto.Message.Request.CancelBuildCommand cancelCommand = request.getCancelBuildCommand();
final UUID targetSessionId = ProtoUtil.fromProtoUUID(cancelCommand.getTargetSessionId());
- synchronized (myBuildsInProgress) {
- for (Iterator<Pair<RunnableFuture, CompilationTask>> it = myBuildsInProgress.iterator(); it.hasNext(); ) {
- final Pair<RunnableFuture, CompilationTask> 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:
}
}
+ private void cancelSession(UUID targetSessionId) {
+ synchronized (myBuildsInProgress) {
+ for (Iterator<Pair<RunnableFuture, CompilationTask>> it = myBuildsInProgress.iterator(); it.hasNext(); ) {
+ final Pair<RunnableFuture, CompilationTask> 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()) {
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()