From d446e60e70f62d31e847c4822a5bcbb9d59b5eb5 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 11 Apr 2016 21:53:31 +0300 Subject: [PATCH] Remove ThreadTracker from gradle plugin ThreadTracker was introduced to detect memory leaks when using gradle daemon. However, it makes quite strong assumption about build lifecycle: there should not be any builds started after kotlin plugin is configured that are alive when buildFinished callback is called. This assumption can be broken by some gradle configurations namely our android tests and gradle 2.13-rc. Since we already have daemon memory leak test (KotlinGradlePluginIT#testKotlinOnlyDaemonMemory), after some discussion it was decided to remove ThreadTracker --- .../gradle/plugin/CleanUpBuildListener.kt | 7 ---- .../kotlin/gradle/plugin/ThreadTracker.kt | 42 ------------------- .../AbstractKotlinAndroidGradleTests.kt | 1 - .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 8 ---- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 4 +- 5 files changed, 1 insertion(+), 61 deletions(-) delete mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CleanUpBuildListener.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CleanUpBuildListener.kt index 0c4b5561d8d..83819b3d35a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CleanUpBuildListener.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CleanUpBuildListener.kt @@ -21,9 +21,7 @@ import org.gradle.BuildAdapter import org.gradle.BuildResult import org.gradle.api.Project import org.gradle.api.logging.Logging -import org.gradle.api.tasks.compile.AbstractCompile import java.util.concurrent.ScheduledExecutorService -import kotlin.properties.Delegates private fun comparableVersionStr(version: String) = @@ -42,7 +40,6 @@ class CleanUpBuildListener(pluginClassLoader: ClassLoader, private val project: } private val log = Logging.getLogger(this.javaClass) - private var threadTracker: ThreadTracker? = ThreadTracker() private val cleanup = CompilerServicesCleanup(pluginClassLoader) private var startMemory: Long? = null @@ -65,15 +62,11 @@ class CleanUpBuildListener(pluginClassLoader: ClassLoader, private val project: log.kotlinDebug("Cleanup after kotlin") cleanup(gradle.gradleVersion) - - // checking thread leaks only then cleaning up - threadTracker?.checkThreadLeak(gradle) } else { log.kotlinDebug("Skipping kotlin cleanup since compiler wasn't called") } - threadTracker = null gradle.removeListener(this) if (kotlinCompilerCalled) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt deleted file mode 100644 index 53f9458c64d..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt +++ /dev/null @@ -1,42 +0,0 @@ -package org.jetbrains.kotlin.gradle.plugin - -import org.gradle.api.invocation.Gradle -import org.gradle.api.logging.Logging -import java.util.* - -class ThreadTracker { - val log = Logging.getLogger(this.javaClass) - private var before: Collection? = getThreads() - - private fun getThreads(): Collection = Thread.getAllStackTraces().keys - - fun checkThreadLeak(gradle: Gradle?) { - try { - val testThreads = gradle != null && gradle.rootProject.hasProperty(ASSERT_THREAD_LEAKS_PROPERTY) - - Thread.sleep(if (testThreads) 200L else 50L) - - val after = HashSet(getThreads()) - after.removeAll(before!!) - - for (thread in after) { - if (thread == Thread.currentThread()) continue - - val name = thread.name - - if (testThreads) { - throw RuntimeException("Thread leaked: $thread: $name\n ${thread.stackTrace.joinToString(separator = "\n", prefix = " at ")}") - } - else { - log.info("Thread leaked: $thread: $name") - } - } - } finally { - before = null - } - } - - companion object { - const val ASSERT_THREAD_LEAKS_PROPERTY = "kotlin.gradle.test.assertThreadLeaks" - } -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt index dde799b3f2a..cc89b2a7c99 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt @@ -13,7 +13,6 @@ abstract class AbstractKotlinAndroidGradleTests( override fun defaultBuildOptions() = BuildOptions(withDaemon = true, - assertThreadLeaks = false, androidHome = File("../../../dependencies/android-sdk-for-tests"), androidGradlePluginVersion = androidGradlePluginVersion) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index c136284f625..2a348226ba5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -3,7 +3,6 @@ package org.jetbrains.kotlin.gradle import com.google.common.io.Files import com.intellij.openapi.util.io.FileUtil import org.gradle.api.logging.LogLevel -import org.jetbrains.kotlin.gradle.plugin.ThreadTracker import org.jetbrains.kotlin.gradle.util.createGradleCommand import org.jetbrains.kotlin.gradle.util.runProcess import org.junit.After @@ -71,10 +70,6 @@ abstract class BaseGradleIT { val withDaemon: Boolean = false, val daemonOptionSupported: Boolean = true, val incremental: Boolean? = null, - /** - * @see [ThreadTracker] - */ - val assertThreadLeaks: Boolean = true, val androidHome: File? = null, val androidGradlePluginVersion: String? = null) @@ -212,9 +207,6 @@ abstract class BaseGradleIT { } add("-PpathToKotlinPlugin=" + File("local-repo").absolutePath) - if (options.assertThreadLeaks) { - add("-P${ThreadTracker.ASSERT_THREAD_LEAKS_PROPERTY}=true") - } options.incremental?.let { add("-Pkotlin.incremental=$it") } options.androidGradlePluginVersion?.let { add("-PandroidToolsVersion=$it")} } diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 9af242e0996..d1806324a76 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -1,15 +1,13 @@ package org.jetbrains.kotlin.gradle import org.junit.Test -import org.jetbrains.kotlin.gradle.BaseGradleIT.Project - class Kotlin2JsGradlePluginIT : BaseGradleIT() { @Test fun testBuildAndClean() { val project = Project("kotlin2JsProject", "1.6") - project.build("build", "-Pkotlin.gradle.noThreadTest=true") { + project.build("build") { assertSuccessful() assertReportExists()