Loading services/core/java/com/android/server/am/TaskPersister.java +48 −39 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ public class TaskPersister { private final RecentTasks mRecentTasks; private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>(); private final File mTaskIdsDir; // To lock file operations in TaskPersister private final Object mIoLock = new Object(); /** * Value determines write delay mode as follows: < 0 We are Flushing. No delays between writes Loading Loading @@ -195,6 +197,7 @@ public class TaskPersister { return mTaskIdsInFile.get(userId).clone(); } final SparseBooleanArray persistedTaskIds = new SparseBooleanArray(); synchronized (mIoLock) { BufferedReader reader = null; String line; try { Loading @@ -212,20 +215,19 @@ public class TaskPersister { } finally { IoUtils.closeQuietly(reader); } } mTaskIdsInFile.put(userId, persistedTaskIds); return persistedTaskIds.clone(); } @VisibleForTesting void maybeWritePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { void writePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { if (userId < 0) { return; } SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId); if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIds)) { return; } final File persistedTaskIdsFile = getUserPersistedTaskIdsFile(userId); synchronized (mIoLock) { BufferedWriter writer = null; try { writer = new BufferedWriter(new FileWriter(persistedTaskIdsFile)); Loading @@ -240,7 +242,7 @@ public class TaskPersister { } finally { IoUtils.closeQuietly(writer); } mTaskIdsInFile.put(userId, taskIds.clone()); } } void unloadUserDataFromMemory(int userId) { Loading Loading @@ -543,16 +545,23 @@ public class TaskPersister { } private void writeTaskIdsFiles() { int candidateUserIds[]; SparseArray<SparseBooleanArray> changedTaskIdsPerUser = new SparseArray<>(); synchronized (mService) { candidateUserIds = mRecentTasks.usersWithRecentsLoadedLocked(); for (int userId : mRecentTasks.usersWithRecentsLoadedLocked()) { SparseBooleanArray taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId); SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId); if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIdsToSave)) { continue; } else { SparseBooleanArray taskIdsToSaveCopy = taskIdsToSave.clone(); mTaskIdsInFile.put(userId, taskIdsToSaveCopy); changedTaskIdsPerUser.put(userId, taskIdsToSaveCopy); } } SparseBooleanArray taskIdsToSave; for (int userId : candidateUserIds) { synchronized (mService) { taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId).clone(); } maybeWritePersistedTaskIdsForUser(taskIdsToSave, userId); for (int i = 0; i < changedTaskIdsPerUser.size(); i++) { writePersistedTaskIdsForUser(changedTaskIdsPerUser.valueAt(i), changedTaskIdsPerUser.keyAt(i)); } } Loading services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ public class TaskPersisterTest extends AndroidTestCase { for (int i = 0; i < 100; i++) { taskIdsOnFile.put(getRandomTaskIdForUser(testUserId), true); } mTaskPersister.maybeWritePersistedTaskIdsForUser(taskIdsOnFile, testUserId); mTaskPersister.writePersistedTaskIdsForUser(taskIdsOnFile, testUserId); SparseBooleanArray newTaskIdsOnFile = mTaskPersister .loadPersistedTaskIdsForUser(testUserId); assertTrue("TaskIds written differ from TaskIds read back from file", Loading Loading
services/core/java/com/android/server/am/TaskPersister.java +48 −39 Original line number Diff line number Diff line Loading @@ -87,6 +87,8 @@ public class TaskPersister { private final RecentTasks mRecentTasks; private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>(); private final File mTaskIdsDir; // To lock file operations in TaskPersister private final Object mIoLock = new Object(); /** * Value determines write delay mode as follows: < 0 We are Flushing. No delays between writes Loading Loading @@ -195,6 +197,7 @@ public class TaskPersister { return mTaskIdsInFile.get(userId).clone(); } final SparseBooleanArray persistedTaskIds = new SparseBooleanArray(); synchronized (mIoLock) { BufferedReader reader = null; String line; try { Loading @@ -212,20 +215,19 @@ public class TaskPersister { } finally { IoUtils.closeQuietly(reader); } } mTaskIdsInFile.put(userId, persistedTaskIds); return persistedTaskIds.clone(); } @VisibleForTesting void maybeWritePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { void writePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { if (userId < 0) { return; } SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId); if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIds)) { return; } final File persistedTaskIdsFile = getUserPersistedTaskIdsFile(userId); synchronized (mIoLock) { BufferedWriter writer = null; try { writer = new BufferedWriter(new FileWriter(persistedTaskIdsFile)); Loading @@ -240,7 +242,7 @@ public class TaskPersister { } finally { IoUtils.closeQuietly(writer); } mTaskIdsInFile.put(userId, taskIds.clone()); } } void unloadUserDataFromMemory(int userId) { Loading Loading @@ -543,16 +545,23 @@ public class TaskPersister { } private void writeTaskIdsFiles() { int candidateUserIds[]; SparseArray<SparseBooleanArray> changedTaskIdsPerUser = new SparseArray<>(); synchronized (mService) { candidateUserIds = mRecentTasks.usersWithRecentsLoadedLocked(); for (int userId : mRecentTasks.usersWithRecentsLoadedLocked()) { SparseBooleanArray taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId); SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId); if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIdsToSave)) { continue; } else { SparseBooleanArray taskIdsToSaveCopy = taskIdsToSave.clone(); mTaskIdsInFile.put(userId, taskIdsToSaveCopy); changedTaskIdsPerUser.put(userId, taskIdsToSaveCopy); } } SparseBooleanArray taskIdsToSave; for (int userId : candidateUserIds) { synchronized (mService) { taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId).clone(); } maybeWritePersistedTaskIdsForUser(taskIdsToSave, userId); for (int i = 0; i < changedTaskIdsPerUser.size(); i++) { writePersistedTaskIdsForUser(changedTaskIdsPerUser.valueAt(i), changedTaskIdsPerUser.keyAt(i)); } } Loading
services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ public class TaskPersisterTest extends AndroidTestCase { for (int i = 0; i < 100; i++) { taskIdsOnFile.put(getRandomTaskIdForUser(testUserId), true); } mTaskPersister.maybeWritePersistedTaskIdsForUser(taskIdsOnFile, testUserId); mTaskPersister.writePersistedTaskIdsForUser(taskIdsOnFile, testUserId); SparseBooleanArray newTaskIdsOnFile = mTaskPersister .loadPersistedTaskIdsForUser(testUserId); assertTrue("TaskIds written differ from TaskIds read back from file", Loading