summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-10-21 10:46:21 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-10-21 10:46:21 +0000
commitf7cb1922483c9509f82bb41f855d9f7e1651a576 (patch)
treee5bd678400cac72259cab05e8dccd037d8052ea8
parenta994119a5aa6a5fa31f522ff17930beceefdef97 (diff)
parentc08c296025a17b72e9a7ac15df8936080505d17e (diff)
Merge "Cache getProfileParent to reduce high volume of binder calls." into main
-rw-r--r--core/java/android/os/UserManager.java31
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java6
2 files changed, 31 insertions, 6 deletions
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index acf4a2f3ec71..fa99f3563de9 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -5602,14 +5602,30 @@ public class UserManager {
android.Manifest.permission.MANAGE_USERS,
android.Manifest.permission.INTERACT_ACROSS_USERS
})
+ @CachedProperty(api = "user_manager_users")
public @Nullable UserHandle getProfileParent(@NonNull UserHandle user) {
- UserInfo info = getProfileParent(user.getIdentifier());
-
- if (info == null) {
- return null;
+ if (android.multiuser.Flags.cacheProfileParentReadOnly()) {
+ final UserHandle userHandle = UserManagerCache.getProfileParent(
+ (UserHandle query) -> {
+ UserInfo info = getProfileParent(query.getIdentifier());
+ // TODO: Remove when b/372923336 is fixed
+ if (info == null) {
+ return UserHandle.of(UserHandle.USER_NULL);
+ }
+ return UserHandle.of(info.id);
+ },
+ user);
+ if (userHandle.getIdentifier() == UserHandle.USER_NULL) {
+ return null;
+ }
+ return userHandle;
+ } else {
+ UserInfo info = getProfileParent(user.getIdentifier());
+ if (info == null) {
+ return null;
+ }
+ return UserHandle.of(info.id);
}
-
- return UserHandle.of(info.id);
}
/**
@@ -6424,6 +6440,9 @@ public class UserManager {
*/
public static final void invalidateCacheOnUserListChange() {
UserManagerCache.invalidateUserSerialNumber();
+ if (android.multiuser.Flags.cacheProfileParentReadOnly()) {
+ UserManagerCache.invalidateProfileParent();
+ }
}
/**
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 6ac8b221b21f..6c03214a2610 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -5790,6 +5790,9 @@ public class UserManagerService extends IUserManager.Stub {
}
userInfo.partial = false;
+ if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) {
+ UserManager.invalidateCacheOnUserListChange();
+ }
synchronized (mPackagesLock) {
writeUserLP(userData);
}
@@ -6382,6 +6385,9 @@ public class UserManagerService extends IUserManager.Stub {
// on next startup, in case the runtime stops now before stopping and
// removing the user completely.
userData.info.partial = true;
+ if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) {
+ UserManager.invalidateCacheOnUserListChange();
+ }
// Mark it as disabled, so that it isn't returned any more when
// profiles are queried.
userData.info.flags |= UserInfo.FLAG_DISABLED;