summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dmitri Plotnikov <dplotnikov@google.com> 2022-12-21 18:01:18 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-12-21 18:01:18 +0000
commit15c52c5407fc9f5baa147a8e062014b0c9b0d3f5 (patch)
treeb4b3cd0cd9f3335b3ba8d4668aeca69fe4654123
parent7f120bc0baebf97349f81538e801f172d84d4fef (diff)
parent484e832a256269e38cc81f1622ce79525d5f1f39 (diff)
Merge "Disable BatteryStatsService watchdog during dumpsys"
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java17
1 files changed, 17 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 23ed0c4e5f82..5b453b268e79 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -153,6 +153,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
private final Context mContext;
private final BatteryExternalStatsWorker mWorker;
private final BatteryUsageStatsProvider mBatteryUsageStatsProvider;
+ private volatile boolean mMonitorEnabled = true;
private native void getRailEnergyPowerStats(RailStats railStats);
private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
@@ -481,6 +482,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
@Override
public void monitor() {
+ if (!mMonitorEnabled) {
+ return;
+ }
synchronized (mLock) {
}
synchronized (mStats) {
@@ -2602,6 +2606,19 @@ public final class BatteryStatsService extends IBatteryStats.Stub
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ // If the monitor() method is already holding a lock on mStats, no harm done: we will
+ // just wait for mStats in the dumpUnmonitored method below. In fact, we would want
+ // Watchdog to catch the service in the act in that situation. We just don't want the
+ // dump method itself to be blamed for holding the lock for too long.
+ mMonitorEnabled = false;
+ try {
+ dumpUnmonitored(fd, pw, args);
+ } finally {
+ mMonitorEnabled = true;
+ }
+ }
+
+ private void dumpUnmonitored(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
int flags = 0;