Loading services/core/java/com/android/server/wm/ActivitySnapshotController.java +11 −31 Original line number Diff line number Diff line Loading @@ -31,8 +31,6 @@ import android.util.SparseArray; import android.window.TaskSnapshot; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.pm.UserManagerInternal; import com.android.server.wm.BaseAppSnapshotPersister.PersistInfoProvider; import com.android.window.flags.Flags; Loading Loading @@ -163,18 +161,12 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord private void cleanUpUserFiles(int userId) { synchronized (mSnapshotPersistQueue.getLock()) { mSnapshotPersistQueue.sendToQueueLocked( new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider) { @Override boolean isReady() { final UserManagerInternal mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); return mUserManagerInternal.isUserUnlocked(userId); } new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider, userId) { @Override void write() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "cleanUpUserFiles"); final File file = mPersistInfoProvider.getDirectory(userId); final File file = mPersistInfoProvider.getDirectory(mUserId); if (file.exists()) { final File[] contents = file.listFiles(); if (contents != null) { Loading Loading @@ -263,15 +255,13 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord class LoadActivitySnapshotItem extends SnapshotPersistQueue.WriteQueueItem { private final int mCode; private final int mUserId; private final ActivityRecord[] mActivities; LoadActivitySnapshotItem(@NonNull ActivityRecord[] activities, int code, int userId, @NonNull PersistInfoProvider persistInfoProvider) { super(persistInfoProvider); super(persistInfoProvider, userId); mActivities = activities; mCode = code; mUserId = userId; } @Override Loading Loading @@ -305,6 +295,11 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord return mCode == other.mCode && mUserId == other.mUserId && mPersistInfoProvider == other.mPersistInfoProvider; } @Override public String toString() { return "LoadActivitySnapshotItem{code=" + mCode + ", UserId=" + mUserId + "}"; } } void loadActivitySnapshot() { Loading Loading @@ -714,24 +709,9 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord } removeTargets.add(usf); } removeSnapshotFiles(removeTargets); } private void removeSnapshotFiles(@NonNull ArrayList<UserSavedFile> files) { synchronized (mSnapshotPersistQueue.getLock()) { mSnapshotPersistQueue.sendToQueueLocked( new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider) { @Override void write() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activity_remove_files"); for (int i = files.size() - 1; i >= 0; --i) { final UserSavedFile usf = files.get(i); mSnapshotPersistQueue.deleteSnapshot( usf.mFileId, usf.mUserId, mPersistInfoProvider); } Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } }); for (int i = removeTargets.size() - 1; i >= 0; --i) { final UserSavedFile usf = removeTargets.get(i); mPersister.removeSnapshot(usf.mFileId, usf.mUserId); } } Loading services/core/java/com/android/server/wm/SnapshotController.java +1 −0 Original line number Diff line number Diff line Loading @@ -211,5 +211,6 @@ class SnapshotController { void dump(PrintWriter pw, String prefix) { mTaskSnapshotController.dump(pw, prefix); mActivitySnapshotController.dump(pw, prefix); mSnapshotPersistQueue.dump(pw, prefix); } } services/core/java/com/android/server/wm/SnapshotPersistQueue.java +36 −16 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.server.wm.nano.WindowManagerProtos.TaskSnapshotProto; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayDeque; /** Loading Loading @@ -155,7 +156,9 @@ class SnapshotPersistQueue { void deleteSnapshot(int index, int userId, PersistInfoProvider provider) { final File protoFile = provider.getProtoFile(index, userId); final File bitmapLowResFile = provider.getLowResolutionBitmapFile(index, userId); if (protoFile.exists()) { protoFile.delete(); } if (bitmapLowResFile.exists()) { bitmapLowResFile.delete(); } Loading @@ -177,7 +180,7 @@ class SnapshotPersistQueue { } else { next = mWriteQueue.poll(); if (next != null) { if (next.isReady()) { if (next.isReady(mUserManagerInternal)) { isReadyToWrite = true; next.onDequeuedLocked(); } else { Loading Loading @@ -210,14 +213,16 @@ class SnapshotPersistQueue { abstract static class WriteQueueItem { protected final PersistInfoProvider mPersistInfoProvider; WriteQueueItem(@NonNull PersistInfoProvider persistInfoProvider) { protected final int mUserId; WriteQueueItem(@NonNull PersistInfoProvider persistInfoProvider, int userId) { mPersistInfoProvider = persistInfoProvider; mUserId = userId; } /** * @return {@code true} if item is ready to have {@link WriteQueueItem#write} called */ boolean isReady() { return true; boolean isReady(UserManagerInternal userManager) { return userManager.isUserUnlocked(mUserId); } abstract void write(); Loading @@ -242,14 +247,12 @@ class SnapshotPersistQueue { class StoreWriteQueueItem extends WriteQueueItem { private final int mId; private final int mUserId; private final TaskSnapshot mSnapshot; StoreWriteQueueItem(int id, int userId, TaskSnapshot snapshot, PersistInfoProvider provider) { super(provider); super(provider, userId); mId = id; mUserId = userId; mSnapshot = snapshot; } Loading @@ -267,11 +270,6 @@ class SnapshotPersistQueue { mStoreQueueItems.remove(this); } @Override boolean isReady() { return mUserManagerInternal.isUserUnlocked(mUserId); } @Override void write() { if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) { Loading Loading @@ -391,6 +389,11 @@ class SnapshotPersistQueue { return mId == other.mId && mUserId == other.mUserId && mPersistInfoProvider == other.mPersistInfoProvider; } @Override public String toString() { return "StoreWriteQueueItem{ID=" + mId + ", UserId=" + mUserId + "}"; } } DeleteWriteQueueItem createDeleteWriteQueueItem(int id, int userId, Loading @@ -400,12 +403,10 @@ class SnapshotPersistQueue { private class DeleteWriteQueueItem extends WriteQueueItem { private final int mId; private final int mUserId; DeleteWriteQueueItem(int id, int userId, PersistInfoProvider provider) { super(provider); super(provider, userId); mId = id; mUserId = userId; } @Override Loading @@ -414,5 +415,24 @@ class SnapshotPersistQueue { deleteSnapshot(mId, mUserId, mPersistInfoProvider); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } @Override public String toString() { return "DeleteWriteQueueItem{ID=" + mId + ", UserId=" + mUserId + "}"; } } void dump(PrintWriter pw, String prefix) { final WriteQueueItem[] items; synchronized (mLock) { items = mWriteQueue.toArray(new WriteQueueItem[0]); } if (items.length == 0) { return; } pw.println(prefix + "PersistQueue contains:"); for (int i = items.length - 1; i >= 0; --i) { pw.println(prefix + " " + items[i] + ""); } } } services/core/java/com/android/server/wm/TaskSnapshotPersister.java +16 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package com.android.server.wm; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import android.os.Trace; import android.os.UserHandle; import android.util.ArraySet; import android.window.TaskSnapshot; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.pm.UserManagerInternal; import java.io.File; import java.util.Arrays; Loading Loading @@ -84,6 +86,9 @@ class TaskSnapshotPersister extends BaseAppSnapshotPersister { * model. */ void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, int[] runningUserIds) { if (runningUserIds.length == 0) { return; } synchronized (mLock) { mPersistedTaskIdsSinceLastRemoveObsolete.clear(); mSnapshotPersistQueue.sendToQueueLocked(new RemoveObsoleteFilesQueueItem( Loading @@ -99,11 +104,21 @@ class TaskSnapshotPersister extends BaseAppSnapshotPersister { @VisibleForTesting RemoveObsoleteFilesQueueItem(ArraySet<Integer> persistentTaskIds, int[] runningUserIds, PersistInfoProvider provider) { super(provider); super(provider, runningUserIds.length > 0 ? runningUserIds[0] : UserHandle.USER_SYSTEM); mPersistentTaskIds = new ArraySet<>(persistentTaskIds); mRunningUserIds = Arrays.copyOf(runningUserIds, runningUserIds.length); } @Override boolean isReady(UserManagerInternal userManagerInternal) { for (int i = mRunningUserIds.length - 1; i >= 0; --i) { if (!userManagerInternal.isUserUnlocked(mRunningUserIds[i])) { return false; } } return true; } @Override void write() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "RemoveObsoleteFilesQueueItem"); Loading Loading
services/core/java/com/android/server/wm/ActivitySnapshotController.java +11 −31 Original line number Diff line number Diff line Loading @@ -31,8 +31,6 @@ import android.util.SparseArray; import android.window.TaskSnapshot; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.pm.UserManagerInternal; import com.android.server.wm.BaseAppSnapshotPersister.PersistInfoProvider; import com.android.window.flags.Flags; Loading Loading @@ -163,18 +161,12 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord private void cleanUpUserFiles(int userId) { synchronized (mSnapshotPersistQueue.getLock()) { mSnapshotPersistQueue.sendToQueueLocked( new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider) { @Override boolean isReady() { final UserManagerInternal mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); return mUserManagerInternal.isUserUnlocked(userId); } new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider, userId) { @Override void write() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "cleanUpUserFiles"); final File file = mPersistInfoProvider.getDirectory(userId); final File file = mPersistInfoProvider.getDirectory(mUserId); if (file.exists()) { final File[] contents = file.listFiles(); if (contents != null) { Loading Loading @@ -263,15 +255,13 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord class LoadActivitySnapshotItem extends SnapshotPersistQueue.WriteQueueItem { private final int mCode; private final int mUserId; private final ActivityRecord[] mActivities; LoadActivitySnapshotItem(@NonNull ActivityRecord[] activities, int code, int userId, @NonNull PersistInfoProvider persistInfoProvider) { super(persistInfoProvider); super(persistInfoProvider, userId); mActivities = activities; mCode = code; mUserId = userId; } @Override Loading Loading @@ -305,6 +295,11 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord return mCode == other.mCode && mUserId == other.mUserId && mPersistInfoProvider == other.mPersistInfoProvider; } @Override public String toString() { return "LoadActivitySnapshotItem{code=" + mCode + ", UserId=" + mUserId + "}"; } } void loadActivitySnapshot() { Loading Loading @@ -714,24 +709,9 @@ class ActivitySnapshotController extends AbsAppSnapshotController<ActivityRecord } removeTargets.add(usf); } removeSnapshotFiles(removeTargets); } private void removeSnapshotFiles(@NonNull ArrayList<UserSavedFile> files) { synchronized (mSnapshotPersistQueue.getLock()) { mSnapshotPersistQueue.sendToQueueLocked( new SnapshotPersistQueue.WriteQueueItem(mPersistInfoProvider) { @Override void write() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activity_remove_files"); for (int i = files.size() - 1; i >= 0; --i) { final UserSavedFile usf = files.get(i); mSnapshotPersistQueue.deleteSnapshot( usf.mFileId, usf.mUserId, mPersistInfoProvider); } Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } }); for (int i = removeTargets.size() - 1; i >= 0; --i) { final UserSavedFile usf = removeTargets.get(i); mPersister.removeSnapshot(usf.mFileId, usf.mUserId); } } Loading
services/core/java/com/android/server/wm/SnapshotController.java +1 −0 Original line number Diff line number Diff line Loading @@ -211,5 +211,6 @@ class SnapshotController { void dump(PrintWriter pw, String prefix) { mTaskSnapshotController.dump(pw, prefix); mActivitySnapshotController.dump(pw, prefix); mSnapshotPersistQueue.dump(pw, prefix); } }
services/core/java/com/android/server/wm/SnapshotPersistQueue.java +36 −16 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import com.android.server.wm.nano.WindowManagerProtos.TaskSnapshotProto; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayDeque; /** Loading Loading @@ -155,7 +156,9 @@ class SnapshotPersistQueue { void deleteSnapshot(int index, int userId, PersistInfoProvider provider) { final File protoFile = provider.getProtoFile(index, userId); final File bitmapLowResFile = provider.getLowResolutionBitmapFile(index, userId); if (protoFile.exists()) { protoFile.delete(); } if (bitmapLowResFile.exists()) { bitmapLowResFile.delete(); } Loading @@ -177,7 +180,7 @@ class SnapshotPersistQueue { } else { next = mWriteQueue.poll(); if (next != null) { if (next.isReady()) { if (next.isReady(mUserManagerInternal)) { isReadyToWrite = true; next.onDequeuedLocked(); } else { Loading Loading @@ -210,14 +213,16 @@ class SnapshotPersistQueue { abstract static class WriteQueueItem { protected final PersistInfoProvider mPersistInfoProvider; WriteQueueItem(@NonNull PersistInfoProvider persistInfoProvider) { protected final int mUserId; WriteQueueItem(@NonNull PersistInfoProvider persistInfoProvider, int userId) { mPersistInfoProvider = persistInfoProvider; mUserId = userId; } /** * @return {@code true} if item is ready to have {@link WriteQueueItem#write} called */ boolean isReady() { return true; boolean isReady(UserManagerInternal userManager) { return userManager.isUserUnlocked(mUserId); } abstract void write(); Loading @@ -242,14 +247,12 @@ class SnapshotPersistQueue { class StoreWriteQueueItem extends WriteQueueItem { private final int mId; private final int mUserId; private final TaskSnapshot mSnapshot; StoreWriteQueueItem(int id, int userId, TaskSnapshot snapshot, PersistInfoProvider provider) { super(provider); super(provider, userId); mId = id; mUserId = userId; mSnapshot = snapshot; } Loading @@ -267,11 +270,6 @@ class SnapshotPersistQueue { mStoreQueueItems.remove(this); } @Override boolean isReady() { return mUserManagerInternal.isUserUnlocked(mUserId); } @Override void write() { if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) { Loading Loading @@ -391,6 +389,11 @@ class SnapshotPersistQueue { return mId == other.mId && mUserId == other.mUserId && mPersistInfoProvider == other.mPersistInfoProvider; } @Override public String toString() { return "StoreWriteQueueItem{ID=" + mId + ", UserId=" + mUserId + "}"; } } DeleteWriteQueueItem createDeleteWriteQueueItem(int id, int userId, Loading @@ -400,12 +403,10 @@ class SnapshotPersistQueue { private class DeleteWriteQueueItem extends WriteQueueItem { private final int mId; private final int mUserId; DeleteWriteQueueItem(int id, int userId, PersistInfoProvider provider) { super(provider); super(provider, userId); mId = id; mUserId = userId; } @Override Loading @@ -414,5 +415,24 @@ class SnapshotPersistQueue { deleteSnapshot(mId, mUserId, mPersistInfoProvider); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } @Override public String toString() { return "DeleteWriteQueueItem{ID=" + mId + ", UserId=" + mUserId + "}"; } } void dump(PrintWriter pw, String prefix) { final WriteQueueItem[] items; synchronized (mLock) { items = mWriteQueue.toArray(new WriteQueueItem[0]); } if (items.length == 0) { return; } pw.println(prefix + "PersistQueue contains:"); for (int i = items.length - 1; i >= 0; --i) { pw.println(prefix + " " + items[i] + ""); } } }
services/core/java/com/android/server/wm/TaskSnapshotPersister.java +16 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package com.android.server.wm; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import android.os.Trace; import android.os.UserHandle; import android.util.ArraySet; import android.window.TaskSnapshot; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.pm.UserManagerInternal; import java.io.File; import java.util.Arrays; Loading Loading @@ -84,6 +86,9 @@ class TaskSnapshotPersister extends BaseAppSnapshotPersister { * model. */ void removeObsoleteFiles(ArraySet<Integer> persistentTaskIds, int[] runningUserIds) { if (runningUserIds.length == 0) { return; } synchronized (mLock) { mPersistedTaskIdsSinceLastRemoveObsolete.clear(); mSnapshotPersistQueue.sendToQueueLocked(new RemoveObsoleteFilesQueueItem( Loading @@ -99,11 +104,21 @@ class TaskSnapshotPersister extends BaseAppSnapshotPersister { @VisibleForTesting RemoveObsoleteFilesQueueItem(ArraySet<Integer> persistentTaskIds, int[] runningUserIds, PersistInfoProvider provider) { super(provider); super(provider, runningUserIds.length > 0 ? runningUserIds[0] : UserHandle.USER_SYSTEM); mPersistentTaskIds = new ArraySet<>(persistentTaskIds); mRunningUserIds = Arrays.copyOf(runningUserIds, runningUserIds.length); } @Override boolean isReady(UserManagerInternal userManagerInternal) { for (int i = mRunningUserIds.length - 1; i >= 0; --i) { if (!userManagerInternal.isUserUnlocked(mRunningUserIds[i])) { return false; } } return true; } @Override void write() { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "RemoveObsoleteFilesQueueItem"); Loading