From a6bc7b1c7664c83a788878a6a76dd3b67e995d53 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sat, 8 Jun 2019 14:33:39 -0700 Subject: [PATCH 1/2] Fix typo --- main/src/main/scala/sbt/internal/SysProp.scala | 2 +- main/src/main/scala/sbt/internal/TaskProgress.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main/src/main/scala/sbt/internal/SysProp.scala b/main/src/main/scala/sbt/internal/SysProp.scala index 138ec14c6..a56adf9ef 100644 --- a/main/src/main/scala/sbt/internal/SysProp.scala +++ b/main/src/main/scala/sbt/internal/SysProp.scala @@ -84,7 +84,7 @@ object SysProp { def supershell: Boolean = color && getOrTrue("sbt.supershell") - def supersheelSleep: Long = long("sbt.supershell.sleep", 100L) + def supershellSleep: Long = long("sbt.supershell.sleep", 100L) def defaultUseCoursier: Boolean = { val coursierOpt = booleanOpt("sbt.coursier") diff --git a/main/src/main/scala/sbt/internal/TaskProgress.scala b/main/src/main/scala/sbt/internal/TaskProgress.scala index dae694248..e249076f6 100644 --- a/main/src/main/scala/sbt/internal/TaskProgress.scala +++ b/main/src/main/scala/sbt/internal/TaskProgress.scala @@ -23,7 +23,7 @@ private[sbt] final class TaskProgress(log: ManagedLogger) with ExecuteProgress[Task] { private[this] val lastTaskCount = new AtomicInteger(0) private[this] val currentProgressThread = new AtomicReference[Option[ProgressThread]](None) - private[this] val sleepDuration = SysProp.supersheelSleep + private[this] val sleepDuration = SysProp.supershellSleep private[this] final class ProgressThread extends Thread("task-progress-report-thread") with AutoCloseable { From a38d2669e120cd2cff43aad3fe6c478ce8eca438 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sat, 8 Jun 2019 14:28:10 -0700 Subject: [PATCH 2/2] Add system property for closing classloaders I realized that some builds may crash if we automatically close the classloaders. While I do think that is a good thing in general that we are closing the loaders by default, we shuold have an option for supressing this behavior. I made all of the custom classloaders that we define for test and run check this property before calling the super.close method. --- main/src/main/java/sbt/internal/FlatLoader.java | 6 ++++++ .../src/main/java/sbt/internal/ScalaLibraryClassLoader.java | 6 ++++++ .../src/main/java/sbt/internal/ScalaReflectClassLoader.java | 6 ++++++ main/src/main/scala/sbt/internal/LayeredClassLoaders.scala | 4 +++- main/src/main/scala/sbt/internal/SysProp.scala | 2 ++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/main/src/main/java/sbt/internal/FlatLoader.java b/main/src/main/java/sbt/internal/FlatLoader.java index 0c0b9682f..1ded2a242 100644 --- a/main/src/main/java/sbt/internal/FlatLoader.java +++ b/main/src/main/java/sbt/internal/FlatLoader.java @@ -7,6 +7,7 @@ package sbt.internal; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -29,4 +30,9 @@ final class FlatLoader extends URLClassLoader { } return "FlatLoader(\n parent = " + getParent() + "\n jars = " + jars.toString() + ")"; } + + @Override + public void close() throws IOException { + if (SysProp.closeClassLoaders()) super.close(); + } } diff --git a/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java b/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java index 7d9d4f679..2baff55bc 100644 --- a/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java +++ b/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java @@ -7,6 +7,7 @@ package sbt.internal; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -31,4 +32,9 @@ final class ScalaLibraryClassLoader extends URLClassLoader { } return "ScalaLibraryClassLoader(" + builder + " parent = " + getParent() + ")"; } + + @Override + public void close() throws IOException { + if (SysProp.closeClassLoaders()) super.close(); + } } diff --git a/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java b/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java index b8a3fff17..18461547b 100644 --- a/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java +++ b/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java @@ -7,6 +7,7 @@ package sbt.internal; +import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; @@ -26,4 +27,9 @@ final class ScalaReflectClassLoader extends URLClassLoader { public String toString() { return "ScalaReflectClassLoader(" + jar + " parent = " + getParent() + ")"; } + + @Override + public void close() throws IOException { + if (SysProp.closeClassLoaders()) super.close(); + } } diff --git a/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala b/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala index 74ec041f8..c8855bc25 100644 --- a/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala +++ b/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala @@ -31,6 +31,7 @@ private[internal] class LayeredClassLoaderImpl( ) extends URLClassLoader(classpath.map(_.toURI.toURL).toArray, parent) with NativeLoader { setTempDir(tempDir) + override def close(): Unit = if (SysProp.closeClassLoaders) super.close() } /** @@ -146,6 +147,7 @@ private[internal] final class ReverseLookupClassLoaderHolder( } override def loadClass(name: String, resolve: Boolean): Class[_] = loadClass(name, resolve, reverseLookup = true) + override def close(): Unit = if (SysProp.closeClassLoaders) super.close() } /** @@ -193,7 +195,7 @@ private[internal] final class ReverseLookupClassLoaderHolder( } override def close(): Unit = { checkin(parent) - super.close() + if (SysProp.closeClassLoaders) super.close() } } } diff --git a/main/src/main/scala/sbt/internal/SysProp.scala b/main/src/main/scala/sbt/internal/SysProp.scala index a56adf9ef..59d5e27bb 100644 --- a/main/src/main/scala/sbt/internal/SysProp.scala +++ b/main/src/main/scala/sbt/internal/SysProp.scala @@ -82,6 +82,8 @@ object SysProp { */ lazy val color: Boolean = ConsoleAppender.formatEnabledInEnv + def closeClassLoaders: Boolean = getOrTrue("sbt.classloader.close") + def supershell: Boolean = color && getOrTrue("sbt.supershell") def supershellSleep: Long = long("sbt.supershell.sleep", 100L)