From 421a6874ee99ce05f551211d34d223e0eeba21dc Mon Sep 17 00:00:00 2001 From: Siim Sammul Date: Wed, 23 Jun 2021 13:52:07 +0100 Subject: [PATCH] Collect binder latency data even when device is charging / device state is unknown. Test: unit test Bug: 180584913 Change-Id: I2e4234b764e4341cea54172309d1f804a7cd5a88 --- .../android/internal/os/BinderCallsStats.java | 8 +++++++- .../internal/os/BinderCallsStatsTest.java | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java index 6f911cbd61211..e3baf90657d07 100644 --- a/core/java/com/android/internal/os/BinderCallsStats.java +++ b/core/java/com/android/internal/os/BinderCallsStats.java @@ -220,7 +220,8 @@ public class BinderCallsStats implements BinderInternal.Observer { public CallSession callStarted(Binder binder, int code, int workSourceUid) { noteNativeThreadId(); - if (!canCollect()) { + // We always want to collect data for latency if it's enabled, regardless of device state. + if (!mCollectLatencyData && !canCollect()) { return null; } @@ -267,6 +268,11 @@ public class BinderCallsStats implements BinderInternal.Observer { mLatencyObserver.callEnded(s); } + // Latency collection has already been processed so check if the rest should be processed. + if (!canCollect()) { + return; + } + UidEntry uidEntry = null; final boolean recordCall; if (s.recordedCall) { diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java index 55943a0dc319e..cac40b2bd586b 100644 --- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java @@ -19,6 +19,7 @@ package com.android.internal.os; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -968,6 +969,22 @@ public class BinderCallsStatsTest { assertEquals(1, bcs.getLatencyObserver().getLatencyHistograms().size()); } + @Test + public void testLatencyCollectionActiveEvenWithoutDeviceState() { + TestBinderCallsStats bcs = new TestBinderCallsStats(null); + bcs.setCollectLatencyData(true); + + Binder binder = new Binder(); + CallSession callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID); + assertNotEquals(null, callSession); + + bcs.time += 10; + bcs.elapsedTime += 20; + bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID); + + assertEquals(1, bcs.getLatencyObserver().getLatencyHistograms().size()); + } + @Test public void testLatencyCollectionEnabledByDefault() { TestBinderCallsStats bcs = new TestBinderCallsStats();