From 976b6885ea9972b374976904a79b7546a964362e Mon Sep 17 00:00:00 2001
From: Tor Norbye <tnorbye@google.com>
Date: Thu, 24 Jan 2019 08:59:30 -0800
Subject: [PATCH] Fix memory leak

Ensure that we clean up the application environment properly when
exiting. This doesn't matter when metalava is invoked as part of the
build since it's invoked and then exited, but when running unit
tests this is important.

Test: Existing unit tests
Change-Id: I83ad663dd649d234cddd0afb6d3cf8f67b1d846f
---
 src/main/java/com/android/tools/metalava/Driver.kt     | 6 +++---
 src/test/java/com/android/tools/metalava/DriverTest.kt | 6 ++++++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/android/tools/metalava/Driver.kt b/src/main/java/com/android/tools/metalava/Driver.kt
index 97ae453..2a440bd 100644
--- a/src/main/java/com/android/tools/metalava/Driver.kt
+++ b/src/main/java/com/android/tools/metalava/Driver.kt
@@ -154,6 +154,8 @@ fun run(
         }
         exitCode = e.exitCode
         exitValue = false
+    } finally {
+        Disposer.dispose(LintCoreApplicationEnvironment.get().parentDisposable)
     }
 
     if (options.updateBaseline) {
@@ -434,8 +436,6 @@ private fun processFlags() {
         AnnotationStatistics(codebase).measureCoverageOf(options.annotationCoverageOf)
     }
 
-    Disposer.dispose(LintCoreApplicationEnvironment.get().parentDisposable)
-
     if (options.verbose) {
         val packageCount = codebase.size()
         options.stdout.println("\n$PROGRAM_NAME finished handling $packageCount packages in $stopwatch")
@@ -900,7 +900,7 @@ fun loadFromJarFile(apiJar: File, manifest: File? = null, preFiltered: Boolean =
 private fun createProjectEnvironment(): LintCoreProjectEnvironment {
     ensurePsiFileCapacity()
     val appEnv = LintCoreApplicationEnvironment.get()
-    val parentDisposable = Disposer.newDisposable()
+    val parentDisposable = appEnv.parentDisposable
 
     if (!assertionsEnabled() &&
         System.getenv(ENV_VAR_METALAVA_DUMP_ARGV) == null &&
diff --git a/src/test/java/com/android/tools/metalava/DriverTest.kt b/src/test/java/com/android/tools/metalava/DriverTest.kt
index 5d521dc..533e58f 100644
--- a/src/test/java/com/android/tools/metalava/DriverTest.kt
+++ b/src/test/java/com/android/tools/metalava/DriverTest.kt
@@ -38,6 +38,7 @@ import com.android.utils.StdLogger
 import com.google.common.io.ByteStreams
 import com.google.common.io.Closeables
 import com.google.common.io.Files
+import com.intellij.openapi.util.Disposer
 import org.intellij.lang.annotations.Language
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNotNull
@@ -94,6 +95,9 @@ abstract class DriverTest {
 
             val sw = StringWriter()
             val writer = PrintWriter(sw)
+
+            Disposer.setDebugMode(true)
+
             if (!com.android.tools.metalava.run(arrayOf(*args), writer, writer)) {
                 val actualFail = cleanupString(sw.toString(), null)
                 if (cleanupString(expectedFail, null).replace(".", "").trim() !=
@@ -124,6 +128,8 @@ abstract class DriverTest {
                 fail("Printed newlines with nothing else")
             }
 
+            Disposer.assertIsEmpty(true)
+
             return printedOutput
         } finally {
             System.setOut(previousOut)
-- 
GitLab