diff --git a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java index b2104378c74e..f3aa5ac43ad4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -669,6 +669,10 @@ final class BuildSession implements Runnable, CanceledStatus { } private class ConstantSearch implements Callbacks.ConstantAffectionResolver { + + private ConstantSearch() { + } + @Nullable @Override public Future request(String ownerClassName, String fieldName, int accessFlags, boolean fieldRemoved, boolean accessChanged) { final CmdlineRemoteProto.Message.BuilderMessage.ConstantSearchTask.Builder task = @@ -678,7 +682,7 @@ final class BuildSession implements Runnable, CanceledStatus { task.setAccessFlags(accessFlags); task.setIsAccessChanged(accessChanged); task.setIsFieldRemoved(fieldRemoved); - final ConstantSearchFuture future = new ConstantSearchFuture(); + final ConstantSearchFuture future = new ConstantSearchFuture(BuildSession.this); final ConstantSearchFuture prev = mySearchTasks.put(new Pair(ownerClassName, fieldName), future); if (prev != null) { prev.setDone(); @@ -694,8 +698,10 @@ final class BuildSession implements Runnable, CanceledStatus { private static class ConstantSearchFuture extends BasicFuture { private volatile Callbacks.ConstantAffection myResult = Callbacks.ConstantAffection.EMPTY; + private final CanceledStatus myCanceledStatus; - private ConstantSearchFuture() { + private ConstantSearchFuture(CanceledStatus canceledStatus) { + myCanceledStatus = canceledStatus; } public void setResult(final Collection affectedFiles) { @@ -705,8 +711,16 @@ final class BuildSession implements Runnable, CanceledStatus { @Override public Callbacks.ConstantAffection get() throws InterruptedException, ExecutionException { - super.get(); - return myResult; + while (true) { + try { + return get(300L, TimeUnit.MILLISECONDS); + } + catch (TimeoutException ignored) { + } + if (myCanceledStatus.isCanceled()) { + return myResult; + } + } } @Override