From 538b361143578779d923da9d7bd383f789c1101f Mon Sep 17 00:00:00 2001 From: "Philip P. Moltmann" Date: Wed, 30 Jan 2019 14:22:27 -0800 Subject: [PATCH] Do not synchronize if not necessary Test: atest CtsStatsdHostTestCases:android.cts.statsd.atom.HostAtomTests#testRoleHolder Change-Id: I60e684338e97db9aa4dd90c3a7ce318e1a9b9a72 --- .../android/server/role/RoleUserState.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java index bc68dded2dfe6..5030e349a4851 100644 --- a/services/core/java/com/android/server/role/RoleUserState.java +++ b/services/core/java/com/android/server/role/RoleUserState.java @@ -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,18 +578,23 @@ public class RoleUserState { @NonNull public ArrayMap> getRoleHolders() { synchronized (mLock) { - ArrayMap> roles = new ArrayMap<>(); - for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) { - String roleName = mRoles.keyAt(i); - ArraySet roleHolders = mRoles.valueAt(i); - - roleHolders = new ArraySet<>(roleHolders); - roles.put(roleName, roleHolders); - } - return roles; + return snapshotRolesLocked(); } } + @GuardedBy("mLock") + private ArrayMap> snapshotRolesLocked() { + ArrayMap> roles = new ArrayMap<>(); + for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) { + String roleName = mRoles.keyAt(i); + ArraySet roleHolders = mRoles.valueAt(i); + + roleHolders = new ArraySet<>(roleHolders); + roles.put(roleName, roleHolders); + } + return roles; + } + /** * Destroy this user state and delete the corresponding file. Any pending writes to the file * will be cancelled, and any future interaction with this state will throw an exception.