Remove all usages of PooledConsumer

Improve readability and avoid overhead of pooled lambda.
Pool is not always efficiency with modern VM.

Bug: 163976519
Test: WmTests
Change-Id: I869c8578ce5940c31a73b77310a266aed9d60e0b
This commit is contained in:
Riddle Hsu
2022-10-17 21:53:04 +08:00
parent a44cf8829d
commit d34ec22020

View File

@@ -141,7 +141,6 @@ import android.window.WindowContainerToken;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.ResolverActivity;
import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.util.function.pooled.PooledConsumer;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.LocalServices;
@@ -269,12 +268,16 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
synchronized (mService.mGlobalLock) {
try {
mTaskSupervisor.beginDeferResume();
final PooledConsumer c = PooledLambda.obtainConsumer(
RootWindowContainer::destroyActivity, RootWindowContainer.this,
PooledLambda.__(ActivityRecord.class));
forAllActivities(c);
c.recycle();
forAllActivities(r -> {
if (r.finishing || !r.isDestroyable()) return;
if (DEBUG_SWITCH) {
Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.getState()
+ " resumed=" + r.getTask().getTopResumedActivity()
+ " pausing=" + r.getTask().getTopPausingActivity()
+ " for reason " + mDestroyAllActivitiesReason);
}
r.destroyImmediately(mDestroyAllActivitiesReason);
});
} finally {
mTaskSupervisor.endDeferResume();
resumeFocusedTasksTopActivities();
@@ -2422,30 +2425,23 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
info.childTaskUserIds = new int[numTasks];
final int[] currentIndex = {0};
final PooledConsumer c = PooledLambda.obtainConsumer(
RootWindowContainer::processTaskForTaskInfo, PooledLambda.__(Task.class), info,
currentIndex);
task.forAllLeafTasks(c, false /* traverseTopToBottom */);
c.recycle();
task.forAllLeafTasks(t -> {
int i = currentIndex[0];
info.childTaskIds[i] = t.mTaskId;
info.childTaskNames[i] = t.origActivity != null ? t.origActivity.flattenToString()
: t.realActivity != null ? t.realActivity.flattenToString()
: t.getTopNonFinishingActivity() != null
? t.getTopNonFinishingActivity().packageName : "unknown";
info.childTaskBounds[i] = t.mAtmService.getTaskBounds(t.mTaskId);
info.childTaskUserIds[i] = t.mUserId;
currentIndex[0] = ++i;
}, false /* traverseTopToBottom */);
final ActivityRecord top = task.topRunningActivity();
info.topActivity = top != null ? top.intent.getComponent() : null;
return info;
}
private static void processTaskForTaskInfo(
Task task, RootTaskInfo info, int[] currentIndex) {
int i = currentIndex[0];
info.childTaskIds[i] = task.mTaskId;
info.childTaskNames[i] = task.origActivity != null ? task.origActivity.flattenToString()
: task.realActivity != null ? task.realActivity.flattenToString()
: task.getTopNonFinishingActivity() != null
? task.getTopNonFinishingActivity().packageName : "unknown";
info.childTaskBounds[i] = task.mAtmService.getTaskBounds(task.mTaskId);
info.childTaskUserIds[i] = task.mUserId;
currentIndex[0] = ++i;
}
RootTaskInfo getRootTaskInfo(int taskId) {
Task task = getRootTask(taskId);
if (task != null) {
@@ -2670,17 +2666,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
}
void clearOtherAppTimeTrackers(AppTimeTracker except) {
final PooledConsumer c = PooledLambda.obtainConsumer(
RootWindowContainer::clearOtherAppTimeTrackers,
PooledLambda.__(ActivityRecord.class), except);
forAllActivities(c);
c.recycle();
}
private static void clearOtherAppTimeTrackers(ActivityRecord r, AppTimeTracker except) {
if (r.appTimeTracker != except) {
r.appTimeTracker = null;
}
forAllActivities(r -> {
if (r.appTimeTracker != except) {
r.appTimeTracker = null;
}
});
}
void scheduleDestroyAllActivities(String reason) {
@@ -2688,19 +2678,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
mService.mH.post(mDestroyAllActivitiesRunnable);
}
private void destroyActivity(ActivityRecord r) {
if (r.finishing || !r.isDestroyable()) return;
if (DEBUG_SWITCH) {
Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.getState()
+ " resumed=" + r.getTask().getTopResumedActivity() + " pausing="
+ r.getTask().getTopPausingActivity() + " for reason "
+ mDestroyAllActivitiesReason);
}
r.destroyImmediately(mDestroyAllActivitiesReason);
}
// Tries to put all activity tasks to sleep. Returns true if all tasks were
// successfully put to sleep.
boolean putTasksToSleep(boolean allowDelay, boolean shuttingDown) {
@@ -3097,18 +3074,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
void updateActivityApplicationInfo(ApplicationInfo aInfo) {
final String packageName = aInfo.packageName;
final int userId = UserHandle.getUserId(aInfo.uid);
final PooledConsumer c = PooledLambda.obtainConsumer(
RootWindowContainer::updateActivityApplicationInfo,
PooledLambda.__(ActivityRecord.class), aInfo, userId, packageName);
forAllActivities(c);
c.recycle();
}
private static void updateActivityApplicationInfo(
ActivityRecord r, ApplicationInfo aInfo, int userId, String packageName) {
if (r.mUserId == userId && packageName.equals(r.packageName)) {
r.updateApplicationInfo(aInfo);
}
forAllActivities(r -> {
if (r.mUserId == userId && packageName.equals(r.packageName)) {
r.updateApplicationInfo(aInfo);
}
});
}
void finishVoiceTask(IVoiceInteractionSession session) {