diff --git a/jps/jps-builders/src/org/jetbrains/jps/api/SharedThreadPool.java b/jps/jps-builders/src/org/jetbrains/jps/api/SharedThreadPool.java index da26e58c6ff0..50603a5cf725 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/api/SharedThreadPool.java +++ b/jps/jps-builders/src/org/jetbrains/jps/api/SharedThreadPool.java @@ -1,12 +1,46 @@ package org.jetbrains.jps.api; +import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; /** * @author Eugene Zhuravlev * Date: 3/29/12 */ -public class SharedThreadPool { - public static final ExecutorService INSTANCE = Executors.newCachedThreadPool(); +public class SharedThreadPool implements Executor { + private static final ExecutorService ourService = Executors.newCachedThreadPool(); + + public static final SharedThreadPool INSTANCE = new SharedThreadPool(); + private SharedThreadPool() { + } + + /** @noinspection MethodMayBeStatic*/ + public Future submit(final Runnable task) { + return ourService.submit(new Runnable() { + public void run() { + try { + task.run(); + } + finally { + Thread.interrupted(); // reset interrupted status + } + } + }); + } + + public void execute(final Runnable task) { + ourService.execute(new Runnable() { + public void run() { + try { + task.run(); + } + finally { + Thread.interrupted(); // reset interrupted status + } + } + }); + } + } 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 d281988360bb..7838b9d84135 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java +++ b/jps/jps-builders/src/org/jetbrains/jps/cmdline/BuildSession.java @@ -249,9 +249,21 @@ final class BuildSession implements Runnable, CanceledStatus { } } finally { + saveData(pd, dataStorageRoot); + } + } + + private void saveData(ProjectDescriptor pd, File dataStorageRoot) { + final boolean wasInterrupted = Thread.interrupted(); + try { saveFsState(dataStorageRoot, pd.fsState, myLastEventOrdinal); pd.release(); } + finally { + if (wasInterrupted) { + Thread.currentThread().interrupt(); + } + } } public void processFSEvent(final CmdlineRemoteProto.Message.ControllerMessage.FSEvent event) {