summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/states
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2018-05-31 14:04:59 -0700
committerSunny Goyal <sunnygoyal@google.com>2018-05-31 14:12:52 -0700
commitf46779fe014ba78478d0a0a88b3fd654d635f18b (patch)
treefd8686335fd9beb61be3c8c814021b6822af7971 /src/com/android/launcher3/states
parentf4392dbf5aa43140a84f357537f0b22decd42946 (diff)
downloadandroid_packages_apps_Trebuchet-f46779fe014ba78478d0a0a88b3fd654d635f18b.tar.gz
android_packages_apps_Trebuchet-f46779fe014ba78478d0a0a88b3fd654d635f18b.tar.bz2
android_packages_apps_Trebuchet-f46779fe014ba78478d0a0a88b3fd654d635f18b.zip
Do not run StateHandler code while holding the lock
Deadlock: Main thread: InternalStateHandler.run() => LauncherFrameDrawn => Switch MotionEventQueue to Main thread => Try to acquire MotionEventQueue lock while holding InternalStateHandler lock Remote UI thread Recents Animation cancel on MotionEventQueue => Cancel SwipeHandler => Clear previously registered InternalStateHandler => Try to acquire InternalStateHandler lock while holding MotionEventQueue lock Bug: 80536505 Change-Id: I75e522edea2a76f8bc90e8abc2a174583cc709c4
Diffstat (limited to 'src/com/android/launcher3/states')
-rw-r--r--src/com/android/launcher3/states/InternalStateHandler.java26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/com/android/launcher3/states/InternalStateHandler.java b/src/com/android/launcher3/states/InternalStateHandler.java
index cf7c6ba39..c6370c5c5 100644
--- a/src/com/android/launcher3/states/InternalStateHandler.java
+++ b/src/com/android/launcher3/states/InternalStateHandler.java
@@ -96,10 +96,12 @@ public abstract class InternalStateHandler extends Binder {
private WeakReference<InternalStateHandler> mPendingHandler = new WeakReference<>(null);
private MainThreadExecutor mMainThreadExecutor;
- public synchronized void schedule(InternalStateHandler handler) {
- mPendingHandler = new WeakReference<>(handler);
- if (mMainThreadExecutor == null) {
- mMainThreadExecutor = new MainThreadExecutor();
+ public void schedule(InternalStateHandler handler) {
+ synchronized (this) {
+ mPendingHandler = new WeakReference<>(handler);
+ if (mMainThreadExecutor == null) {
+ mMainThreadExecutor = new MainThreadExecutor();
+ }
}
mMainThreadExecutor.execute(this);
}
@@ -118,23 +120,25 @@ public abstract class InternalStateHandler extends Binder {
initIfPending(launcher, launcher.isStarted());
}
- public synchronized boolean initIfPending(Launcher launcher, boolean alreadyOnHome) {
+ public boolean initIfPending(Launcher launcher, boolean alreadyOnHome) {
InternalStateHandler pendingHandler = mPendingHandler.get();
if (pendingHandler != null) {
if (!pendingHandler.init(launcher, alreadyOnHome)) {
- mPendingHandler.clear();
+ clearReference(pendingHandler);
}
return true;
}
return false;
}
- public synchronized boolean clearReference(InternalStateHandler handler) {
- if (mPendingHandler.get() == handler) {
- mPendingHandler.clear();
- return true;
+ public boolean clearReference(InternalStateHandler handler) {
+ synchronized (this) {
+ if (mPendingHandler.get() == handler) {
+ mPendingHandler.clear();
+ return true;
+ }
+ return false;
}
- return false;
}
public boolean hasPending() {