From 8ed54a6dbad638a65232e90184cd977e0ada0ed6 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 9 Apr 2015 21:28:27 +0300 Subject: [PATCH] Additional stop for JobScheduler Background threads prevents class loader collect #KT-7172 In Progress --- .../kotlin/gradle/plugin/FinishBuildListener.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/FinishBuildListener.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/FinishBuildListener.kt index 9700fd18dfc..287618a3282 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/FinishBuildListener.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/FinishBuildListener.kt @@ -17,9 +17,10 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.BuildAdapter -import org.gradle.api.logging.Logging import org.gradle.BuildResult +import org.gradle.api.logging.Logging import java.lang.ref.Reference +import java.util.concurrent.ScheduledExecutorService class FinishBuildListener(var pluginClassLoader: ParentLastURLClassLoader?) : BuildAdapter() { val log = Logging.getLogger(this.javaClass) @@ -29,6 +30,7 @@ class FinishBuildListener(var pluginClassLoader: ParentLastURLClassLoader?) : Bu stopZipFileCache() stopLowMemoryWatcher() + stopJobScheduler() // TODO: Try to clean up thread locals without this ugly hack // TODO: Further investigation of PermGen leak (KT-6451) @@ -81,6 +83,18 @@ class FinishBuildListener(var pluginClassLoader: ParentLastURLClassLoader?) : Bu log.debug("LowMemoryWatcher finished successfully") } + private fun stopJobScheduler() { + log.debug("Stop JobScheduler") + + val jobSchedulerClass = Class.forName("com.intellij.concurrency.JobScheduler", false, pluginClassLoader) + + val getSchedulerMethod = jobSchedulerClass.getMethod("getScheduler") + val executorService = getSchedulerMethod.invoke(this) as ScheduledExecutorService + + executorService.shutdown() + log.debug("JobScheduler stopped") + } + private fun callVoidStaticMethod(classFqName: String, methodName: String) { val shortName = classFqName.substring(classFqName.lastIndexOf('.') + 1)