summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt26
1 files changed, 26 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt b/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt
index 6d589aac2079..9a1bd25556a5 100644
--- a/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt
+++ b/packages/SystemUI/src/com/android/systemui/log/LogBuffer.kt
@@ -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,19 @@ class LogBuffer @JvmOverloads constructor(
}
private val buffer: ArrayDeque<LogMessageImpl> = ArrayDeque()
+ private val echoMessageQueue: BlockingQueue<LogMessageImpl> = ArrayBlockingQueue(poolSize)
+
+ init {
+ 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 +192,16 @@ class LogBuffer @JvmOverloads constructor(
buffer.removeFirst()
}
buffer.add(message as LogMessageImpl)
+ // Log in the background thread only if it has capacity to avoid blocking this thread
+ if (echoMessageQueue.remainingCapacity() > 0) {
+ echoMessageQueue.put(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)