From 0f7795752b84b90d126f30fbb43ad7eff370462a Mon Sep 17 00:00:00 2001 From: Anton Makeev Date: Mon, 21 Sep 2009 18:21:31 +0400 Subject: [PATCH] RunConfigurations: log files updating moved out of the UI thread --- .../diagnostic/logging/LogFilesManager.java | 53 ++++++++++--------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java index 9f26ab34d151..b57a753f24af 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogFilesManager.java @@ -3,10 +3,10 @@ package com.intellij.diagnostic.logging; import com.intellij.execution.configurations.LogFileOptions; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.process.ProcessHandler; -import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.util.Alarm; +import gnu.trove.THashSet; import javax.swing.*; import java.io.File; @@ -17,11 +17,13 @@ import java.util.*; * Date: 01-Feb-2006 */ public class LogFilesManager { + private static final int UPDATE_INTERVAL = 500; + private final Map> myLogFileManagerMap = new LinkedHashMap>(); private final Map myLogFileToConfiguration = new HashMap(); private final Runnable myUpdateRequest; private final LogConsoleManager myManager; - private Alarm myUpdateAlarm = new Alarm(); + private Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD); public LogFilesManager(final Project project, LogConsoleManager manager) { myManager = manager; @@ -30,28 +32,33 @@ public class LogFilesManager { if (project.isDisposed()) return; if (myUpdateAlarm == null) return; //already disposed myUpdateAlarm.cancelAllRequests(); - for (LogFileOptions logFile : myLogFileManagerMap.keySet()) { + for (final LogFileOptions logFile : myLogFileManagerMap.keySet()) { final Set oldFiles = myLogFileManagerMap.get(logFile); - final Set newFiles = logFile.getPaths(); - addConfigurationConsoles(logFile, new Condition(){ - public boolean value(final String file) { - return !oldFiles.contains(file); + final Set newFiles = logFile.getPaths(); // should not be called in UI thread + myLogFileManagerMap.put(logFile, newFiles); + + final Set obsoleteFiles = new THashSet(oldFiles); + obsoleteFiles.removeAll(newFiles); + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + addConfigurationConsoles(logFile, new Condition() { + public boolean value(final String file) { + return !oldFiles.contains(file); + } + }); + for (String each : obsoleteFiles) { + myManager.removeLogConsole(each); + } + myUpdateAlarm.addRequest(myUpdateRequest, UPDATE_INTERVAL); } }); - for (String oldFile : oldFiles) { - if (!newFiles.contains(oldFile)){ - myManager.removeLogConsole(oldFile); - } - } - oldFiles.clear(); - oldFiles.addAll(newFiles); } - myUpdateAlarm.addRequest(myUpdateRequest, 300, ModalityState.NON_MODAL); } }; } - public void registerFileMatcher(final RunConfigurationBase runConfiguration){ + public void registerFileMatcher(final RunConfigurationBase runConfiguration) { final ArrayList logFiles = runConfiguration.getAllLogFiles(); for (LogFileOptions logFile : logFiles) { if (logFile.isEnabled()) { @@ -59,17 +66,13 @@ public class LogFilesManager { myLogFileToConfiguration.put(logFile, runConfiguration); } } - SwingUtilities.invokeLater(new Runnable() { - public void run() { - Alarm updateAlarm = myUpdateAlarm; - if (updateAlarm != null) { - updateAlarm.addRequest(myUpdateRequest, 300, ModalityState.NON_MODAL); - } - } - }); + Alarm updateAlarm = myUpdateAlarm; + if (updateAlarm != null) { + updateAlarm.addRequest(myUpdateRequest, UPDATE_INTERVAL); + } } - public void unregisterFileMatcher(){ + public void unregisterFileMatcher() { if (myUpdateAlarm != null) { myUpdateAlarm.cancelAllRequests(); myUpdateAlarm = null;