From c3af3cc482bcd7b9c827544c923fdcef001b8e1d Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Tue, 9 Oct 2018 15:25:33 +0300 Subject: [PATCH] Configuration: Do not use read action during conpiler settings loading It may lead to deadlock (see KT-27298) #KT-27298 Fixed --- .../configuration/BaseKotlinCompilerSettings.kt | 6 +++--- .../configuration/BaseKotlinCompilerSettings.kt.181 | 6 +++--- .../src/org/jetbrains/kotlin/idea/projectUtil.kt | 13 +++++++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/projectUtil.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt index 325b1370396..231e33bd31b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.compiler.configuration import com.intellij.openapi.components.PersistentStateComponent -import com.intellij.openapi.progress.util.BackgroundTaskUtil import com.intellij.openapi.project.Project import com.intellij.openapi.util.Comparing import com.intellij.openapi.util.JDOMUtil @@ -29,6 +28,7 @@ import com.intellij.util.xmlb.XmlSerializer import gnu.trove.THashMap import org.jdom.Element import org.jetbrains.kotlin.cli.common.arguments.* +import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck import kotlin.reflect.KClass abstract class BaseKotlinCompilerSettings protected constructor(private val project: Project) : PersistentStateComponent, Cloneable { @@ -76,7 +76,7 @@ abstract class BaseKotlinCompilerSettings protected constructor(p validateNewSettings(value) _settings = value - BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) + project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) } fun update(changer: T.() -> Unit) { @@ -111,7 +111,7 @@ abstract class BaseKotlinCompilerSettings protected constructor(p XmlSerializer.deserializeInto(this, state) } - BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) + project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) } public override fun clone(): Any = super.clone() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 index bdf8f796e92..244d4e1fb5b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/configuration/BaseKotlinCompilerSettings.kt.181 @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.compiler.configuration import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.components.StoragePathMacros.PROJECT_CONFIG_DIR -import com.intellij.openapi.progress.util.BackgroundTaskUtil import com.intellij.openapi.project.Project import com.intellij.openapi.util.Comparing import com.intellij.openapi.util.JDOMUtil @@ -31,6 +30,7 @@ import gnu.trove.THashMap import org.jdom.Element import org.jetbrains.kotlin.cli.common.arguments.* import org.jetbrains.kotlin.config.SettingConstants +import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck import kotlin.reflect.KClass abstract class BaseKotlinCompilerSettings protected constructor(private val project: Project) : PersistentStateComponent, Cloneable { @@ -78,7 +78,7 @@ abstract class BaseKotlinCompilerSettings protected constructor(p validateNewSettings(value) _settings = value - BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) + project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(value) } fun update(changer: T.() -> Unit) { @@ -113,7 +113,7 @@ abstract class BaseKotlinCompilerSettings protected constructor(p XmlSerializer.deserializeInto(this, state) } - BackgroundTaskUtil.syncPublisher(project, KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) + project.syncPublisherWithDisposeCheck(KotlinCompilerSettingsListener.TOPIC).settingsChanged(settings) } public override fun clone(): Any = super.clone() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/projectUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/projectUtil.kt new file mode 100644 index 00000000000..eacc6f6959b --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/projectUtil.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea + +import com.intellij.openapi.progress.ProcessCanceledException +import com.intellij.openapi.project.Project +import com.intellij.util.messages.Topic + +fun Project.syncPublisherWithDisposeCheck(topic: Topic) = + if (isDisposed) throw ProcessCanceledException() else messageBus.syncPublisher(topic) \ No newline at end of file