Change "checkTidValid" to only call into AM if necessary

Currently calling into AM during createHintSession causes a lot
of overhead in situations where it isn't really needed. This patch
just makes the call lazy and only evaluates it if it's necessary to
fully check the tid list.

Bug: 272002264
Test: manual
Change-Id: I547010f2fac1d3128527d456ccb82ad68b277d3a
This commit is contained in:
Matt Buckley
2023-03-31 00:22:28 +00:00
parent 179677e824
commit 77d75bf13e

View File

@@ -48,7 +48,6 @@ import com.android.server.utils.Slogf;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -324,16 +323,7 @@ public final class HintManagerService extends SystemService {
private boolean checkTidValid(int uid, int tgid, int [] tids) {
// Make sure all tids belongs to the same UID (including isolated UID),
// tids can belong to different application processes.
List<Integer> eligiblePids = null;
// To avoid deadlock, do not call into AMS if the call is from system.
if (uid != Process.SYSTEM_UID) {
eligiblePids = mAmInternal.getIsolatedProcesses(uid);
}
if (eligiblePids == null) {
eligiblePids = new ArrayList<>();
}
eligiblePids.add(tgid);
List<Integer> isolatedPids = null;
for (int threadId : tids) {
final String[] procStatusKeys = new String[] {
"Uid:",
@@ -345,7 +335,21 @@ public final class HintManagerService extends SystemService {
int pidOfThreadId = (int) output[1];
// use PID check for isolated processes, use UID check for non-isolated processes.
if (eligiblePids.contains(pidOfThreadId) || uidOfThreadId == uid) {
if (pidOfThreadId == tgid || uidOfThreadId == uid) {
continue;
}
// Only call into AM if the tid is either isolated or invalid
if (isolatedPids == null) {
// To avoid deadlock, do not call into AMS if the call is from system.
if (uid == Process.SYSTEM_UID) {
return false;
}
isolatedPids = mAmInternal.getIsolatedProcesses(uid);
if (isolatedPids == null) {
return false;
}
}
if (isolatedPids.contains(pidOfThreadId)) {
continue;
}
return false;