From 518c4bcba30a1064d2bb6802c3dda47508677b14 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 3 Jul 2012 23:35:14 +0200 Subject: [PATCH] 1. utils: asyncDelete utility now returns a Future object 2. external build: before exiting ensure all async deletions are completed --- .../jps/incremental/IncProjectBuilder.java | 10 +++-- .../intellij/openapi/util/io/FileUtil.java | 39 +++++++++++++++---- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 26e7198fd8cb..046b30f3413c 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -302,7 +302,7 @@ public class IncProjectBuilder { } } - private static void clearOutputs(CompileContext context) throws ProjectBuildException, IOException { + private void clearOutputs(CompileContext context) throws ProjectBuildException, IOException { final Collection modulesToClean = context.getProject().getModules().values(); final Map>> rootsToDelete = new HashMap>>(); // map: outputRoot-> setOfPairs([module, isTest]) final Set annotationOutputs = new HashSet(); // separate collection because no root intersection checks needed for annotation generated sources @@ -385,7 +385,9 @@ public class IncProjectBuilder { } context.processMessage(new ProgressMessage("Cleaning output directories...")); - FileUtil.asyncDelete(filesToDelete); + myAsyncTasks.add( + FileUtil.asyncDelete(filesToDelete) + ); } private static void appendRootInfo(Map>> rootsToDelete, File out, Module module, boolean isTest) { @@ -458,7 +460,9 @@ public class IncProjectBuilder { rootFiles.add(rd.root); context.getProjectDescriptor().fsState.clearRecompile(rd); } - FileUtil.asyncDelete(rootFiles); + myAsyncTasks.add( + FileUtil.asyncDelete(rootFiles) + ); } try { diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index df6b71adda33..60defe0e8434 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -40,6 +40,7 @@ import java.io.*; import java.lang.reflect.Method; import java.nio.channels.FileChannel; import java.util.*; +import java.util.concurrent.*; import java.util.regex.Pattern; @SuppressWarnings({"UtilityClassWithoutPrivateConstructor", "MethodOverridesStaticMethodOfSuperclass"}) @@ -289,15 +290,17 @@ public class FileUtil extends FileUtilRt { return result; } - public static void asyncDelete(@NotNull File file) { + @NotNull + public static Future asyncDelete(@NotNull File file) { final File tempFile = renameToTempFileOrDelete(file); if (tempFile == null) { - return; + return new CompletedFuture(); } - startDeletionThread(tempFile); + return startDeletionThread(tempFile); } - public static void asyncDelete(@NotNull Collection files) { + @NotNull + public static Future asyncDelete(@NotNull Collection files) { List tempFiles = new ArrayList(); for (File file : files) { final File tempFile = renameToTempFileOrDelete(file); @@ -306,12 +309,13 @@ public class FileUtil extends FileUtilRt { } } if (!tempFiles.isEmpty()) { - startDeletionThread(tempFiles.toArray(new File[tempFiles.size()])); + return startDeletionThread(tempFiles.toArray(new File[tempFiles.size()])); } + return new CompletedFuture(); } - private static void startDeletionThread(@NotNull final File... tempFiles) { - final Runnable deleteFilesTask = new Runnable() { + private static Future startDeletionThread(@NotNull final File... tempFiles) { + final RunnableFuture deleteFilesTask = new FutureTask(new Runnable() { public void run() { final Thread currentThread = Thread.currentThread(); final int priority = currentThread.getPriority(); @@ -325,7 +329,7 @@ public class FileUtil extends FileUtilRt { currentThread.setPriority(priority); } } - }; + }, null); try { // Attempt to execute on pooled thread @@ -340,6 +344,7 @@ public class FileUtil extends FileUtilRt { Thread t = new Thread(deleteFilesTask, "File deletion thread"); t.start(); } + return deleteFilesTask; } private static File renameToTempFileOrDelete(@NotNull File file) { @@ -1279,4 +1284,22 @@ public class FileUtil extends FileUtilRt { JAVA_IO_FILESYSTEM = fs; JAVA_IO_FILESYSTEM_GET_BOOLEAN_ATTRIBUTES_METHOD = getBooleanAttributes; } + + private static final class CompletedFuture implements Future { + public boolean cancel(boolean mayInterruptIfRunning) { + return false; + } + public boolean isCancelled() { + return false; + } + public boolean isDone() { + return true; + } + public T get() throws InterruptedException, ExecutionException { + return null; + } + public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + return null; + } + } }