Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 888a4596 authored by Suprabh Shukla's avatar Suprabh Shukla Committed by android-build-merger
Browse files

Resolving race condition while writing recent taskids am: fd0bd4f3 am: c9e7c49d

am: e59b5664

Change-Id: I0a603cc99a2901147a65ded2b54e28d3545ff851
parents de90e22b e59b5664
Loading
Loading
Loading
Loading
+48 −39
Original line number Diff line number Diff line
@@ -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
@@ -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 {
@@ -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));
@@ -240,7 +242,7 @@ public class TaskPersister {
            } finally {
                IoUtils.closeQuietly(writer);
            }
        mTaskIdsInFile.put(userId, taskIds.clone());
        }
    }

    void unloadUserDataFromMemory(int userId) {
@@ -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));
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -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",