mirror of https://github.com/sbt/sbt.git
Merge pull request #7191 from adpi2/fix-deadlock
[1.9.x] Fix dead lock between `LoggerContext` and `Terminal`
This commit is contained in:
commit
60ea2a5334
|
|
@ -9,6 +9,7 @@ package sbt.util
|
||||||
|
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
import java.util.concurrent.atomic.AtomicReference
|
||||||
import org.apache.logging.log4j.{ Level => XLevel }
|
import org.apache.logging.log4j.{ Level => XLevel }
|
||||||
import org.apache.logging.log4j.core.{ Appender => XAppender, LoggerContext => XLoggerContext }
|
import org.apache.logging.log4j.core.{ Appender => XAppender, LoggerContext => XLoggerContext }
|
||||||
import org.apache.logging.log4j.core.config.{ AppenderRef, LoggerConfig }
|
import org.apache.logging.log4j.core.config.{ AppenderRef, LoggerConfig }
|
||||||
|
|
@ -114,28 +115,28 @@ object LoggerContext {
|
||||||
}
|
}
|
||||||
private[util] class LoggerContextImpl extends LoggerContext {
|
private[util] class LoggerContextImpl extends LoggerContext {
|
||||||
private class Log extends MiniLogger {
|
private class Log extends MiniLogger {
|
||||||
private val consoleAppenders: java.util.Vector[(Appender, Level.Value)] =
|
private val consoleAppenders: AtomicReference[Vector[(Appender, Level.Value)]] =
|
||||||
new java.util.Vector
|
new AtomicReference(Vector.empty)
|
||||||
def log(level: Level.Value, message: => String): Unit = {
|
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) {
|
if (toAppend.nonEmpty) {
|
||||||
val m = message
|
val m = message
|
||||||
toAppend.foreach { case (a, l) => a.appendLog(level, m) }
|
toAppend.foreach { case (a, l) => a.appendLog(level, m) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
def log[T](level: Level.Value, message: ObjectEvent[T]): Unit = {
|
def log[T](level: Level.Value, message: ObjectEvent[T]): Unit = {
|
||||||
consoleAppenders.forEach {
|
consoleAppenders.get.foreach {
|
||||||
case (a, l) =>
|
case (a, l) =>
|
||||||
if (level.compare(l) >= 0) a.appendObjectEvent(level, message)
|
if (level.compare(l) >= 0) a.appendObjectEvent(level, message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
def addAppender(newAppender: (Appender, Level.Value)): Unit =
|
def addAppender(newAppender: (Appender, Level.Value)): Unit =
|
||||||
Util.ignoreResult(consoleAppenders.add(newAppender))
|
Util.ignoreResult(consoleAppenders.updateAndGet(_ :+ newAppender))
|
||||||
def clearAppenders(): Unit = {
|
def clearAppenders(): Unit = {
|
||||||
consoleAppenders.forEach { case (a, _) => a.close() }
|
consoleAppenders.get.foreach { case (a, _) => a.close() }
|
||||||
consoleAppenders.clear()
|
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 loggers = new ConcurrentHashMap[String, Log]
|
||||||
private[this] val closed = new AtomicBoolean(false)
|
private[this] val closed = new AtomicBoolean(false)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue