OSDN Git Service

Make sure to mutex around job-set iteration
authorChristopher Tate <ctate@google.com>
Wed, 17 Jan 2018 22:40:38 +0000 (14:40 -0800)
committerChristopher Tate <ctate@google.com>
Wed, 17 Jan 2018 23:02:21 +0000 (15:02 -0800)
If something mucks with the job set while we're iterating through
it, we're going to have a bad day.

Change-Id: I2e5603f4dd025b2e1819c7e84d59882bad98ae7a
Fixes: 72105511
Test: atest CtsJobSchedulerTestCases
Test: atest FrameworksServicesTests:com.android.server.job.BackgroundRestrictionsTest

services/core/java/com/android/server/job/controllers/BackgroundJobsController.java

index 5f95f1a..1d053a5 100644 (file)
 package com.android.server.job.controllers;
 
 import android.content.Context;
-import android.os.IDeviceIdleController;
-import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.os.UserHandle;
 import android.util.Slog;
 import android.util.proto.ProtoOutputStream;
 
-import com.android.internal.util.ArrayUtils;
 import com.android.server.ForceAppStandbyTracker;
 import com.android.server.ForceAppStandbyTracker.Listener;
 import com.android.server.job.JobSchedulerService;
@@ -44,7 +41,6 @@ public final class BackgroundJobsController extends StateController {
     private static volatile BackgroundJobsController sController;
 
     private final JobSchedulerService mJobSchedulerService;
-    private final IDeviceIdleController mDeviceIdleController;
 
     private final ForceAppStandbyTracker mForceAppStandbyTracker;
 
@@ -62,8 +58,6 @@ public final class BackgroundJobsController extends StateController {
     private BackgroundJobsController(JobSchedulerService service, Context context, Object lock) {
         super(service, context, lock);
         mJobSchedulerService = service;
-        mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
-                ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
 
         mForceAppStandbyTracker = ForceAppStandbyTracker.getInstance(context);
 
@@ -235,17 +229,23 @@ public final class BackgroundJobsController extends StateController {
     private final Listener mForceAppStandbyListener = new Listener() {
         @Override
         public void updateAllJobs() {
-            updateAllJobRestrictionsLocked();
+            synchronized (mLock) {
+                updateAllJobRestrictionsLocked();
+            }
         }
 
         @Override
         public void updateJobsForUid(int uid) {
-            updateJobRestrictionsForUidLocked(uid);
+            synchronized (mLock) {
+                updateJobRestrictionsForUidLocked(uid);
+            }
         }
 
         @Override
         public void updateJobsForUidPackage(int uid, String packageName) {
-            updateJobRestrictionsForUidLocked(uid);
+            synchronized (mLock) {
+                updateJobRestrictionsForUidLocked(uid);
+            }
         }
     };
 }