From 8cd7120131c6c635bacd6e17d0b192ce03e61997 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 28 Dec 2022 15:38:44 +0000 Subject: [PATCH] Reduce lock contention when starting process (1/N) - Synchronize by itself instead of global lock. - ArrayList is more efficient if the size is small. Bug: 204870457 Test: CtsWindowManagerDeviceTestCases Change-Id: Ieb167c8b2ecd783afba9b5e8218415653be5c239 --- .../server/wm/ActivityTaskManagerService.java | 14 +++++++------- .../server/wm/ActivityTaskSupervisor.java | 2 +- .../android/server/wm/CompatModePackages.java | 2 +- .../server/wm/WindowProcessController.java | 18 ++++++++++++++---- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index f4d76c2603a2b..a50c4a1b85c00 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6363,7 +6363,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { int wakefulness) { synchronized (mGlobalLock) { if (mHomeProcess != null && (dumpPackage == null - || mHomeProcess.mPkgList.contains(dumpPackage))) { + || mHomeProcess.containsPackage(dumpPackage))) { if (needSep) { pw.println(); needSep = false; @@ -6371,7 +6371,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { pw.println(" mHomeProcess: " + mHomeProcess); } if (mPreviousProcess != null && (dumpPackage == null - || mPreviousProcess.mPkgList.contains(dumpPackage))) { + || mPreviousProcess.containsPackage(dumpPackage))) { if (needSep) { pw.println(); needSep = false; @@ -6379,14 +6379,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { pw.println(" mPreviousProcess: " + mPreviousProcess); } if (dumpAll && (mPreviousProcess == null || dumpPackage == null - || mPreviousProcess.mPkgList.contains(dumpPackage))) { + || mPreviousProcess.containsPackage(dumpPackage))) { StringBuilder sb = new StringBuilder(128); sb.append(" mPreviousProcessVisibleTime: "); TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb); pw.println(sb); } if (mHeavyWeightProcess != null && (dumpPackage == null - || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) { + || mHeavyWeightProcess.containsPackage(dumpPackage))) { if (needSep) { pw.println(); needSep = false; @@ -6510,18 +6510,18 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } if (mHomeProcess != null && (dumpPackage == null - || mHomeProcess.mPkgList.contains(dumpPackage))) { + || mHomeProcess.containsPackage(dumpPackage))) { mHomeProcess.dumpDebug(proto, HOME_PROC); } if (mPreviousProcess != null && (dumpPackage == null - || mPreviousProcess.mPkgList.contains(dumpPackage))) { + || mPreviousProcess.containsPackage(dumpPackage))) { mPreviousProcess.dumpDebug(proto, PREVIOUS_PROC); proto.write(PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime); } if (mHeavyWeightProcess != null && (dumpPackage == null - || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) { + || mHeavyWeightProcess.containsPackage(dumpPackage))) { mHeavyWeightProcess.dumpDebug(proto, HEAVY_WEIGHT_PROC); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 3f885f3ab23f5..8184bd63bffee 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -1717,7 +1717,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // Don't kill the home process along with tasks from the same package. continue; } - if (!proc.mPkgList.contains(pkg)) { + if (!proc.containsPackage(pkg)) { // Don't kill process that is not associated with this task. continue; } diff --git a/services/core/java/com/android/server/wm/CompatModePackages.java b/services/core/java/com/android/server/wm/CompatModePackages.java index a035948564dc2..d5828ef082512 100644 --- a/services/core/java/com/android/server/wm/CompatModePackages.java +++ b/services/core/java/com/android/server/wm/CompatModePackages.java @@ -566,7 +566,7 @@ public final class CompatModePackages { SparseArray pidMap = mService.mProcessMap.getPidMap(); for (int i = pidMap.size() - 1; i >= 0; i--) { final WindowProcessController app = pidMap.valueAt(i); - if (!app.mPkgList.contains(packageName)) { + if (!app.containsPackage(packageName)) { continue; } try { diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 91452c6663a26..eb5d7a8583bd1 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -73,6 +73,7 @@ import android.util.Slog; import android.util.proto.ProtoOutputStream; import android.view.IRemoteAnimationRunner; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.HeavyWeightSwitcherActivity; import com.android.internal.protolog.common.ProtoLog; @@ -115,7 +116,8 @@ public class WindowProcessController extends ConfigurationContainer mPkgList = new ArraySet<>(); + @GuardedBy("itself") + private final ArrayList mPkgList = new ArrayList<>(1); private final WindowProcessListener mListener; private final ActivityTaskManagerService mAtm; private final BackgroundLaunchProcessController mBgLaunchController; @@ -640,18 +642,26 @@ public class WindowProcessController extends ConfigurationContainer