From f1190682cc1edbb0026ba3f26d7c5a2c15058c82 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Fri, 14 Aug 2020 11:44:28 -0700 Subject: [PATCH] Only initialize console terminal streams when used In dogfooding sbt, I found that the WriteableInputStream used by the console terminal initialized before it was needed. This would lead to multiple instances of the WriteableInputStream being created, which could lead to zombie threads reading from stdin. I'm not 100% sure what the classloading scenario was that caused this to be a problem but in a few days of using sbt after these changes, I haven't seem zombie threads. --- .../src/main/scala/sbt/internal/util/ConsoleAppender.scala | 2 +- .../src/main/scala/sbt/internal/util/Terminal.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index 5ededd5ef..1777b78bd 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -33,7 +33,7 @@ object ConsoleLogger { @deprecated("Use EscHelpers.removeEscapeSequences instead", "0.13.x") def removeEscapeSequences(s: String): String = EscHelpers.removeEscapeSequences(s) @deprecated("Use ConsoleAppender.formatEnabledInEnv instead", "0.13.x") - val formatEnabled = ConsoleAppender.formatEnabledInEnv + lazy val formatEnabled = ConsoleAppender.formatEnabledInEnv @deprecated("Use ConsoleAppender.noSuppressedMessage instead", "0.13.x") val noSuppressedMessage = ConsoleAppender.noSuppressedMessage diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index 3c7d7a008..929e0f529 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -460,7 +460,7 @@ object Terminal { () } } - private[this] val nonBlockingIn: WriteableInputStream = + private[this] lazy val nonBlockingIn: WriteableInputStream = new WriteableInputStream(jline.TerminalFactory.get.wrapInIfNeeded(originalIn), "console") private[this] val inputStream = new AtomicReference[InputStream](System.in)