Skip to content
Snippets Groups Projects
Commit 4682c657 authored by Justin Weir's avatar Justin Weir Committed by Android (Google) Code Review
Browse files

Merge changes from topic "b221419865" into tm-dev

* changes:
  Change Logcat to only log in background thread in debug mode
  Move logging to background thread in LogBuffer
parents 123c1b09 1702ffa6
No related branches found
No related tags found
No related merge requests found
......@@ -23,6 +23,9 @@ import java.io.PrintWriter
import java.text.SimpleDateFormat
import java.util.ArrayDeque
import java.util.Locale
import java.util.concurrent.ArrayBlockingQueue
import java.util.concurrent.BlockingQueue
import kotlin.concurrent.thread
/**
* A simple ring buffer of recyclable log messages
......@@ -81,6 +84,22 @@ class LogBuffer @JvmOverloads constructor(
}
private val buffer: ArrayDeque<LogMessageImpl> = ArrayDeque()
private val echoMessageQueue: BlockingQueue<LogMessageImpl>? =
if (logcatEchoTracker.logInBackgroundThread) ArrayBlockingQueue(poolSize) else null
init {
if (logcatEchoTracker.logInBackgroundThread && echoMessageQueue != null) {
thread(start = true, priority = Thread.NORM_PRIORITY) {
try {
while (true) {
echoToDesiredEndpoints(echoMessageQueue.take())
}
} catch (e: InterruptedException) {
Thread.currentThread().interrupt()
}
}
}
}
var frozen = false
private set
......@@ -176,6 +195,22 @@ class LogBuffer @JvmOverloads constructor(
buffer.removeFirst()
}
buffer.add(message as LogMessageImpl)
// Log in the background thread only if echoMessageQueue exists and has capacity (checking
// capacity avoids the possibility of blocking this thread)
if (echoMessageQueue != null && echoMessageQueue.remainingCapacity() > 0) {
try {
echoMessageQueue.put(message)
} catch (e: InterruptedException) {
// the background thread has been shut down, so just log on this one
echoToDesiredEndpoints(message)
}
} else {
echoToDesiredEndpoints(message)
}
}
/** Sends message to echo after determining whether to use Logcat and/or systrace. */
private fun echoToDesiredEndpoints(message: LogMessageImpl) {
val includeInLogcat = logcatEchoTracker.isBufferLoggable(name, message.level) ||
logcatEchoTracker.isTagLoggable(message.tag, message.level)
echo(message, toLogcat = includeInLogcat, toSystrace = systrace)
......
......@@ -29,4 +29,9 @@ interface LogcatEchoTracker {
* Whether [tagName] should echo messages of [level] or higher to logcat.
*/
fun isTagLoggable(tagName: String, level: LogLevel): Boolean
/**
* Whether to log messages in a background thread.
*/
val logInBackgroundThread: Boolean
}
......@@ -41,6 +41,7 @@ class LogcatEchoTrackerDebug private constructor(
) : LogcatEchoTracker {
private val cachedBufferLevels: MutableMap<String, LogLevel> = mutableMapOf()
private val cachedTagLevels: MutableMap<String, LogLevel> = mutableMapOf()
override val logInBackgroundThread = true
companion object Factory {
@JvmStatic
......
......@@ -20,6 +20,8 @@ package com.android.systemui.log
* Production version of [LogcatEchoTracker] that isn't configurable.
*/
class LogcatEchoTrackerProd : LogcatEchoTracker {
override val logInBackgroundThread = false
override fun isBufferLoggable(bufferName: String, level: LogLevel): Boolean {
return level >= LogLevel.WARNING
}
......
......@@ -30,6 +30,7 @@ fun logcatLogBuffer(name: String = "EchoToLogcatLogBuffer") =
* A [LogcatEchoTracker] that always allows echoing to the logcat.
*/
class LogcatEchoTrackerAlways : LogcatEchoTracker {
override val logInBackgroundThread = false
override fun isBufferLoggable(bufferName: String, level: LogLevel): Boolean = true
override fun isTagLoggable(tagName: String, level: LogLevel): Boolean = true
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment