diff --git a/platform/util/src/com/intellij/util/io/BaseOutputReader.java b/platform/util/src/com/intellij/util/io/BaseOutputReader.java index f607f90cb16a..1bfe86265fdc 100644 --- a/platform/util/src/com/intellij/util/io/BaseOutputReader.java +++ b/platform/util/src/com/intellij/util/io/BaseOutputReader.java @@ -127,7 +127,7 @@ public abstract class BaseOutputReader extends BaseDataReader { } } - private void sendLine(StringBuilder line) { + protected void sendLine(@NotNull StringBuilder line) { onTextAvailable(line.toString()); line.setLength(0); } diff --git a/platform/util/src/com/intellij/util/io/OutputReader.java b/platform/util/src/com/intellij/util/io/OutputReader.java index 159adec84429..e70ae63689a9 100644 --- a/platform/util/src/com/intellij/util/io/OutputReader.java +++ b/platform/util/src/com/intellij/util/io/OutputReader.java @@ -28,6 +28,7 @@ import java.nio.charset.Charset; public abstract class OutputReader extends BaseOutputReader { private static final Logger LOG = Logger.getInstance("#com.intellij.util.io.OutputReader"); + private static final int READ_FULLY_TIMEOUT = 10; private final Semaphore myReadFullySemaphore = new Semaphore(); @@ -80,13 +81,34 @@ public abstract class OutputReader extends BaseOutputReader { } } + @Override + protected void sendLine(@NotNull StringBuilder line) { + super.sendLine(line); + + if (mySleepingPolicy == SleepingPolicy.BLOCKING) { + myReadFullySemaphore.up(); + } + } + public void readFully() throws InterruptedException { - myReadFullySemaphore.down(); - while (!myReadFullySemaphore.waitForUnsafe(10)) { - if (isStopped) { - waitFor(); - return; + if (mySleepingPolicy != SleepingPolicy.BLOCKING) { + myReadFullySemaphore.down(); + while (!myReadFullySemaphore.waitForUnsafe(READ_FULLY_TIMEOUT)) { + if (isStopped) { + waitFor(); + return; + } } } + else { + do { + myReadFullySemaphore.down(); + } + while (myReadFullySemaphore.waitForUnsafe(READ_FULLY_TIMEOUT)); + + myReadFullySemaphore.up(); + + if (isStopped) waitFor(); + } } }