OSDN Git Service

Do not synchronize if not necessary
authorPhilip P. Moltmann <moltmann@google.com>
Wed, 30 Jan 2019 22:22:27 +0000 (14:22 -0800)
committerPhilip P. Moltmann <moltmann@google.com>
Wed, 30 Jan 2019 22:35:07 +0000 (14:35 -0800)
Test: atest CtsStatsdHostTestCases:android.cts.statsd.atom.HostAtomTests#testRoleHolder
Change-Id: I60e684338e97db9aa4dd90c3a7ce318e1a9b9a72

services/core/java/com/android/server/role/RoleUserState.java

index bc68dde..5030e34 100644 (file)
@@ -376,7 +376,7 @@ public class RoleUserState {
 
             version = mVersion;
             packagesHash = mPackagesHash;
-            roles = getRoleHolders();
+            roles = snapshotRolesLocked();
         }
 
         AtomicFile atomicFile = new AtomicFile(getFile(mUserId), "roles-" + mUserId);
@@ -541,7 +541,7 @@ public class RoleUserState {
 
             version = mVersion;
             packagesHash = mPackagesHash;
-            roles = getRoleHolders();
+            roles = snapshotRolesLocked();
         }
 
         long fieldToken = dumpOutputStream.start(fieldName, fieldId);
@@ -578,16 +578,21 @@ public class RoleUserState {
     @NonNull
     public ArrayMap<String, ArraySet<String>> getRoleHolders() {
         synchronized (mLock) {
-            ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>();
-            for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) {
-                String roleName = mRoles.keyAt(i);
-                ArraySet<String> roleHolders = mRoles.valueAt(i);
+            return snapshotRolesLocked();
+        }
+    }
 
-                roleHolders = new ArraySet<>(roleHolders);
-                roles.put(roleName, roleHolders);
-            }
-            return roles;
+    @GuardedBy("mLock")
+    private ArrayMap<String, ArraySet<String>> snapshotRolesLocked() {
+        ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>();
+        for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) {
+            String roleName = mRoles.keyAt(i);
+            ArraySet<String> roleHolders = mRoles.valueAt(i);
+
+            roleHolders = new ArraySet<>(roleHolders);
+            roles.put(roleName, roleHolders);
         }
+        return roles;
     }
 
     /**