From 8325bee9e716cb26b692d0ca68cd97f2a694fb54 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 28 Apr 2015 14:03:03 +0300 Subject: [PATCH] mem leak --- .../execution/junit/JUnitProcessHandler.java | 12 +++++++++++- .../execution/junit2/segments/Extractor.java | 19 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/junit/JUnitProcessHandler.java b/java/execution/impl/src/com/intellij/execution/junit/JUnitProcessHandler.java index ef77c1f54f1c..01132371ae04 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JUnitProcessHandler.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JUnitProcessHandler.java @@ -19,7 +19,10 @@ import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.junit2.segments.Extractor; import com.intellij.execution.process.KillableColoredProcessHandler; +import com.intellij.execution.process.ProcessAdapter; +import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessTerminatedListener; +import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.NotNull; import java.io.Reader; @@ -31,11 +34,18 @@ public class JUnitProcessHandler extends KillableColoredProcessHandler { private final Extractor myOut; private final Extractor myErr; - public JUnitProcessHandler(@NotNull GeneralCommandLine commandLine) throws ExecutionException { + private JUnitProcessHandler(@NotNull GeneralCommandLine commandLine) throws ExecutionException { super(commandLine); myOut = new Extractor(getProcess().getInputStream(), commandLine.getCharset()); myErr = new Extractor(getProcess().getErrorStream(), commandLine.getCharset()); + addProcessListener(new ProcessAdapter(){ + @Override + public void processTerminated(ProcessEvent event) { + Disposer.dispose(myOut); + Disposer.dispose(myErr); + } + }); } @Override diff --git a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java index 50affa1c68bb..c0e57bd0e2e4 100644 --- a/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java +++ b/java/execution/impl/src/com/intellij/execution/junit2/segments/Extractor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,9 @@ package com.intellij.execution.junit2.segments; import com.intellij.execution.junit.SegmentedInputStreamReader; import com.intellij.execution.junit2.SegmentedInputStream; import com.intellij.execution.testframework.Printable; +import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.EmptyRunnable; import com.intellij.rt.execution.junit.segments.PacketProcessor; import com.intellij.util.concurrency.SequentialTaskExecutor; import org.jetbrains.annotations.NotNull; @@ -31,20 +33,19 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; /** * @author dyoma */ -public class Extractor { +public class Extractor implements Disposable { private static final int MAX_TASKS_TO_PROCESS_AT_ONCE = 100; private DeferredActionsQueue myFulfilledWorkGate = null; private final SegmentedInputStream myStream; private OutputPacketProcessor myEventsDispatcher; private static final Logger LOG = Logger.getInstance("#" + Extractor.class.getName()); - private final Executor myExecutor = new SequentialTaskExecutor(PooledThreadExecutor.INSTANCE); + private final SequentialTaskExecutor myExecutor = new SequentialTaskExecutor(PooledThreadExecutor.INSTANCE); private final BlockingQueue myTaskQueue = new LinkedBlockingQueue(); public Extractor(@NotNull InputStream stream, @NotNull Charset charset) { @@ -55,6 +56,16 @@ public class Extractor { myFulfilledWorkGate.setDispactchListener(listener); } + @Override + public void dispose() { + // wait until all our submitted tasks are executed + try { + myExecutor.submit(EmptyRunnable.getInstance()).get(); + } + catch (Exception ignored) { + } + } + public void setPacketDispatcher(@NotNull final PacketProcessor packetProcessor, final DeferredActionsQueue queue) { myFulfilledWorkGate = new DeferredActionsQueue() { //todo make it all later @Override