From a11234794acbc94e4808b7dd57f8337b1aa51f1f Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 19 Oct 2015 17:46:04 -0700 Subject: 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 --- .../src/com/android/documentsui/RecentLoader.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'packages/DocumentsUI') diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java index f5908c5..407838a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java @@ -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 { private final RootsCache mRoots; private final State mState; + @GuardedBy("mTasks") private final HashMap mTasks = Maps.newHashMap(); private final int mSortOrder = State.SORT_ORDER_LAST_MODIFIED; @@ -167,6 +169,12 @@ public class RecentLoader extends AsyncTaskLoader { @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 { // 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); -- cgit v1.1