Add locking when mutating RecentTasks.

Otherwise there is a really rare race condition where we try tearing
down the tasks while we're still setting them up.

Bug: 25078914
Change-Id: Icf89241f9abec3fadc8606cfb4fbc029bbe91515
This commit is contained in:
Jeff Sharkey
2015-10-19 17:46:04 -07:00
parent 56859f323c
commit a11234794a

View File

@@ -36,6 +36,7 @@ import android.util.Log;
import com.android.documentsui.BaseActivity.State;
import com.android.documentsui.model.RootInfo;
import com.android.internal.annotations.GuardedBy;
import com.google.android.collect.Maps;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.AbstractFuture;
@@ -81,6 +82,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
private final RootsCache mRoots;
private final State mState;
@GuardedBy("mTasks")
private final HashMap<RootInfo, RecentTask> mTasks = Maps.newHashMap();
private final int mSortOrder = State.SORT_ORDER_LAST_MODIFIED;
@@ -167,6 +169,12 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
@Override
public DirectoryResult loadInBackground() {
synchronized (mTasks) {
return loadInBackgroundLocked();
}
}
private DirectoryResult loadInBackgroundLocked() {
if (mFirstPassLatch == null) {
// First time through we kick off all the recent tasks, and wait
// around to see if everyone finishes quickly.
@@ -304,8 +312,10 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> {
// Ensure the loader is stopped
onStopLoading();
for (RecentTask task : mTasks.values()) {
IoUtils.closeQuietly(task);
synchronized (mTasks) {
for (RecentTask task : mTasks.values()) {
IoUtils.closeQuietly(task);
}
}
IoUtils.closeQuietly(mResult);