summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2019-05-29 11:05:30 -0700
committerSunny Goyal <sunnygoyal@google.com>2019-05-29 11:07:10 -0700
commit51f220dac29f3b988b668893f29f78c4c9a33473 (patch)
treee03c340b01687524f9274e3c5a2ffa2c0d8a934d
parent5860288fc85dd45cd58e85be5454c8191bd38e23 (diff)
downloadandroid_packages_apps_Trebuchet-51f220dac29f3b988b668893f29f78c4c9a33473.tar.gz
android_packages_apps_Trebuchet-51f220dac29f3b988b668893f29f78c4c9a33473.tar.bz2
android_packages_apps_Trebuchet-51f220dac29f3b988b668893f29f78c4c9a33473.zip
Fixing ANR when loader task could run while helding the lock object
During AppWidgetRestoredReceiver, we call forceReload from worker thread which in turn starts the loader while holding mLock. This causes other loader calls on UI thread to cause ANR Bug: 133651528 Change-Id: Iabf983c4319bd6e6ef88e74fe6076289294454f9
-rw-r--r--src/com/android/launcher3/LauncherModel.java24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index e7b4ff4fe..ac392a6e6 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -165,17 +165,6 @@ public class LauncherModel extends BroadcastReceiver
mBgAllAppsList = new AllAppsList(iconCache, appFilter);
}
- /** Runs the specified runnable immediately if called from the worker thread, otherwise it is
- * posted on the worker thread handler. */
- private static void runOnWorkerThread(Runnable r) {
- if (sWorkerThread.getThreadId() == Process.myTid()) {
- r.run();
- } else {
- // If we are not on the worker thread, then post to the worker handler
- sWorker.post(r);
- }
- }
-
public void setPackageState(PackageInstallInfo installInfo) {
enqueueModelUpdateTask(new PackageInstallStateChangedTask(installInfo));
}
@@ -400,7 +389,10 @@ public class LauncherModel extends BroadcastReceiver
synchronized (mLock) {
stopLoader();
mLoaderTask = new LoaderTask(mApp, mBgAllAppsList, sBgDataModel, results);
- runOnWorkerThread(mLoaderTask);
+
+ // Always post the loader task, instead of running directly (even on same thread) so
+ // that we exit any nested synchronized blocks
+ sWorker.post(mLoaderTask);
}
}
@@ -505,7 +497,13 @@ public class LauncherModel extends BroadcastReceiver
public void enqueueModelUpdateTask(ModelUpdateTask task) {
task.init(mApp, this, sBgDataModel, mBgAllAppsList, mUiExecutor);
- runOnWorkerThread(task);
+
+ if (sWorkerThread.getThreadId() == Process.myTid()) {
+ task.run();
+ } else {
+ // If we are not on the worker thread, then post to the worker handler
+ sWorker.post(task);
+ }
}
/**