diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt index a1f763150d2e..8b5c28c05b3c 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt @@ -123,6 +123,7 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi private val schemeManagerProvider = SchemeManagerIprProvider("configuration") + @Suppress("LeakingThis") private val workspaceSchemeManager = SchemeManagerFactory.getInstance(project).create("workspace", RunConfigurationSchemeManager(this, false), streamProvider = schemeManagerProvider, autoSave = false) internal var projectSchemeManager: SchemeManager? = null @@ -853,20 +854,16 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi } override fun getConfigurationIcon(settings: RunnerAndConfigurationSettings, withLiveIndicator: Boolean): Icon { - val uniqueID = settings.uniqueID - val selectedConfiguration = selectedConfiguration - val selectedId = if (selectedConfiguration != null) selectedConfiguration.uniqueID else "" - if (selectedId == uniqueID) { - iconCache.checkValidity(uniqueID) + val uniqueId = settings.uniqueID + if (selectedConfiguration?.uniqueID == uniqueId) { + iconCache.checkValidity(uniqueId) } - var icon = iconCache.get(uniqueID, settings, project) + var icon = iconCache.get(uniqueId, settings, project) if (withLiveIndicator) { val runningDescriptors = ExecutionManagerImpl.getInstance(project).getRunningDescriptors { it === settings } - if (runningDescriptors.size == 1) { - icon = ExecutionUtil.getLiveIndicator(icon) - } - if (runningDescriptors.size > 1) { - icon = IconUtil.addText(icon, runningDescriptors.size.toString()) + when { + runningDescriptors.size == 1 -> icon = ExecutionUtil.getLiveIndicator(icon) + runningDescriptors.size > 1 -> icon = IconUtil.addText(icon, runningDescriptors.size.toString()) } } return icon @@ -1108,6 +1105,7 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi settings.schemeManager?.removeScheme(settings as RunnerAndConfigurationSettingsImpl) recentlyUsedTemporaries.remove(settings) removed.add(settings) + iconCache.remove(settings.uniqueID) } else { var isChanged = false diff --git a/platform/lang-impl/src/com/intellij/execution/impl/TimedIconCache.kt b/platform/lang-impl/src/com/intellij/execution/impl/TimedIconCache.kt index ccab9f442d82..8c4f75753c13 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/TimedIconCache.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/TimedIconCache.kt @@ -40,51 +40,61 @@ class TimedIconCache { fun remove(id: String) { lock.write { + idToIcon.remove(id) iconCheckTimes.remove(id) + iconCalcTime.remove(id) } } fun get(id: String, settings: RunnerAndConfigurationSettings, project: Project): Icon { - return lock.read { idToIcon.get(id) } ?: IconDeferrer.getInstance().deferAutoUpdatable(settings.configuration?.icon, project.hashCode() xor settings.hashCode()) { param -> - if (project.isDisposed) { - return@deferAutoUpdatable null + return lock.read { idToIcon.get(id) } ?: lock.write { + idToIcon.get(id)?.let { + return it } - lock.write { - iconCalcTime.remove(id) - } - - val startTime = System.currentTimeMillis() - - var icon: Icon - if (DumbService.isDumb(project) && !Registry.`is`("dumb.aware.run.configurations")) { - icon = IconLoader.getDisabledIcon(ProgramRunnerUtil.getRawIcon(settings))!! - if (settings.isTemporary) { - icon = ProgramRunnerUtil.getTemporaryIcon(icon) + val icon = IconDeferrer.getInstance().deferAutoUpdatable(settings.configuration.icon, project.hashCode() xor settings.hashCode()) { + if (project.isDisposed) { + return@deferAutoUpdatable null } - } - else { - try { - DumbService.getInstance(project).isAlternativeResolveEnabled = true - settings.checkSettings() - icon = ProgramRunnerUtil.getConfigurationIcon(settings, false) + + lock.write { + iconCalcTime.remove(id) } - catch (e: IndexNotReadyException) { - icon = ProgramRunnerUtil.getConfigurationIcon(settings, !Registry.`is`("dumb.aware.run.configurations")) + + val startTime = System.currentTimeMillis() + + var icon: Icon + if (DumbService.isDumb(project) && !Registry.`is`("dumb.aware.run.configurations")) { + icon = IconLoader.getDisabledIcon(ProgramRunnerUtil.getRawIcon(settings))!! + if (settings.isTemporary) { + icon = ProgramRunnerUtil.getTemporaryIcon(icon) + } } - catch (ignored: RuntimeConfigurationException) { - icon = ProgramRunnerUtil.getConfigurationIcon(settings, true) + else { + try { + DumbService.getInstance(project).isAlternativeResolveEnabled = true + settings.checkSettings() + icon = ProgramRunnerUtil.getConfigurationIcon(settings, false) + } + catch (e: IndexNotReadyException) { + icon = ProgramRunnerUtil.getConfigurationIcon(settings, !Registry.`is`("dumb.aware.run.configurations")) + } + catch (ignored: RuntimeConfigurationException) { + icon = ProgramRunnerUtil.getConfigurationIcon(settings, true) + } + finally { + DumbService.getInstance(project).isAlternativeResolveEnabled = false + } } - finally { - DumbService.getInstance(project).isAlternativeResolveEnabled = false + + lock.write { + iconCalcTime.put(id, System.currentTimeMillis() - startTime) } - } - lock.write { - iconCalcTime.put(id, System.currentTimeMillis() - startTime) - set(id, icon) + icon } + set(id, icon) icon } }