Merge pull request #7191 from adpi2/fix-deadlock

[1.9.x] Fix dead lock between `LoggerContext` and `Terminal`
This commit is contained in:
adpi2 2023-03-28 16:25:36 +02:00 committed by GitHub
commit 60ea2a5334
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 8 deletions

View File

@ -9,6 +9,7 @@ package sbt.util
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
import org.apache.logging.log4j.{ Level => XLevel }
import org.apache.logging.log4j.core.{ Appender => XAppender, LoggerContext => XLoggerContext }
import org.apache.logging.log4j.core.config.{ AppenderRef, LoggerConfig }
@ -114,28 +115,28 @@ object LoggerContext {
}
private[util] class LoggerContextImpl extends LoggerContext {
private class Log extends MiniLogger {
private val consoleAppenders: java.util.Vector[(Appender, Level.Value)] =
new java.util.Vector
private val consoleAppenders: AtomicReference[Vector[(Appender, Level.Value)]] =
new AtomicReference(Vector.empty)
def log(level: Level.Value, message: => String): Unit = {
val toAppend = consoleAppenders.asScala.filter { case (a, l) => level.compare(l) >= 0 }
val toAppend = consoleAppenders.get.filter { case (a, l) => level.compare(l) >= 0 }
if (toAppend.nonEmpty) {
val m = message
toAppend.foreach { case (a, l) => a.appendLog(level, m) }
}
}
def log[T](level: Level.Value, message: ObjectEvent[T]): Unit = {
consoleAppenders.forEach {
consoleAppenders.get.foreach {
case (a, l) =>
if (level.compare(l) >= 0) a.appendObjectEvent(level, message)
}
}
def addAppender(newAppender: (Appender, Level.Value)): Unit =
Util.ignoreResult(consoleAppenders.add(newAppender))
Util.ignoreResult(consoleAppenders.updateAndGet(_ :+ newAppender))
def clearAppenders(): Unit = {
consoleAppenders.forEach { case (a, _) => a.close() }
consoleAppenders.clear()
consoleAppenders.get.foreach { case (a, _) => a.close() }
consoleAppenders.set(Vector.empty)
}
def appenders: Seq[Appender] = consoleAppenders.asScala.map(_._1).toVector
def appenders: Seq[Appender] = consoleAppenders.get.map(_._1)
}
private[this] val loggers = new ConcurrentHashMap[String, Log]
private[this] val closed = new AtomicBoolean(false)