OSDN Git Service

Give DeviceStorageMonitorService it's own thread.
authorJeff Sharkey <jsharkey@android.com>
Wed, 2 Aug 2017 20:24:35 +0000 (14:24 -0600)
committerJeff Sharkey <jsharkey@android.com>
Wed, 2 Aug 2017 20:24:38 +0000 (14:24 -0600)
When devices are low on space, it calls down into installd to clear
cached files, which can block for a long time.  Instead of risking
the wrath of the Watchdog on IoThread, give ourselves a separate
thread.

Test: builds, boots
Bug: 64080821
Change-Id: Iaca00966bb836d58e8d2400d6c9d544023ef1af8

services/core/java/com/android/server/storage/DeviceStorageMonitorService.java

index 88b6d87..a35383f 100644 (file)
@@ -29,6 +29,7 @@ import android.os.Binder;
 import android.os.Environment;
 import android.os.FileObserver;
 import android.os.Handler;
+import android.os.HandlerThread;
 import android.os.Message;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
@@ -154,20 +155,8 @@ public class DeviceStorageMonitorService extends SystemService {
 
     private static final String TV_NOTIFICATION_CHANNEL_ID = "devicestoragemonitor.tv";
 
-    /**
-     * Handler that checks the amount of disk space on the device and sends a
-     * notification if the device runs low on disk space
-     */
-    private final Handler mHandler = new Handler(IoThread.get().getLooper()) {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_CHECK:
-                    check();
-                    return;
-            }
-        }
-    };
+    private final HandlerThread mHandlerThread;
+    private final Handler mHandler;
 
     private State findOrCreateState(UUID uuid) {
         State state = mStates.get(uuid);
@@ -256,6 +245,20 @@ public class DeviceStorageMonitorService extends SystemService {
 
     public DeviceStorageMonitorService(Context context) {
         super(context);
+
+        mHandlerThread = new HandlerThread(TAG, android.os.Process.THREAD_PRIORITY_BACKGROUND);
+        mHandlerThread.start();
+
+        mHandler = new Handler(mHandlerThread.getLooper()) {
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                    case MSG_CHECK:
+                        check();
+                        return;
+                }
+            }
+        };
     }
 
     private static boolean isBootImageOnDisk() {