OSDN Git Service

Fix dead lock between AM and BatterySaverStateMachine
authorMakoto Onuki <omakoto@google.com>
Fri, 30 Mar 2018 23:15:35 +0000 (16:15 -0700)
committerMakoto Onuki <omakoto@google.com>
Fri, 30 Mar 2018 23:15:35 +0000 (16:15 -0700)
Change-Id: If641ad1a0961376de65fdb9d557e7e2e601af389
Fixes: 77308319
Test: Boot, toggle battery saver
Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java

services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java
services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java

index 5b3182e..2860521 100644 (file)
@@ -26,6 +26,7 @@ import android.util.proto.ProtoOutputStream;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.os.BackgroundThread;
 import com.android.server.power.BatterySaverPolicy;
 import com.android.server.power.BatterySaverStateMachineProto;
 
@@ -124,25 +125,33 @@ public class BatterySaverStateMachine {
         if (DEBUG) {
             Slog.d(TAG, "onBootCompleted");
         }
-        synchronized (mLock) {
+        // This is called with the power manager lock held. Don't do any
+        runOnBgThread(() -> {
+            synchronized (mLock) {
 
-            final ContentResolver cr = mContext.getContentResolver();
-            cr.registerContentObserver(Settings.Global.getUriFor(
-                    Settings.Global.LOW_POWER_MODE),
-                    false, mSettingsObserver, UserHandle.USER_SYSTEM);
-            cr.registerContentObserver(Settings.Global.getUriFor(
-                    Settings.Global.LOW_POWER_MODE_STICKY),
-                    false, mSettingsObserver, UserHandle.USER_SYSTEM);
-            cr.registerContentObserver(Settings.Global.getUriFor(
-                    Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
-                    false, mSettingsObserver, UserHandle.USER_SYSTEM);
+                final ContentResolver cr = mContext.getContentResolver();
+                cr.registerContentObserver(Settings.Global.getUriFor(
+                        Settings.Global.LOW_POWER_MODE),
+                        false, mSettingsObserver, UserHandle.USER_SYSTEM);
+                cr.registerContentObserver(Settings.Global.getUriFor(
+                        Settings.Global.LOW_POWER_MODE_STICKY),
+                        false, mSettingsObserver, UserHandle.USER_SYSTEM);
+                cr.registerContentObserver(Settings.Global.getUriFor(
+                        Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
+                        false, mSettingsObserver, UserHandle.USER_SYSTEM);
 
-            mBootCompleted = true;
+                mBootCompleted = true;
 
-            refreshSettingsLocked();
+                refreshSettingsLocked();
 
-            doAutoBatterySaverLocked();
-        }
+                doAutoBatterySaverLocked();
+            }
+        });
+    }
+
+    @VisibleForTesting
+    void runOnBgThread(Runnable r) {
+        BackgroundThread.getHandler().post(r);
     }
 
     void refreshSettingsLocked() {
index ab640d6..1367f58 100644 (file)
@@ -139,6 +139,11 @@ public class BatterySaverStateMachineTest {
         protected int getGlobalSetting(String key, int defValue) {
             return mDevice.getGlobalSetting(key, defValue);
         }
+
+        @Override
+        void runOnBgThread(Runnable r) {
+            r.run();
+        }
     }
 
     @Before