summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jorim Jaggi <jjaggi@google.com> 2017-06-15 06:11:10 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-06-15 06:11:15 +0000
commit7831f0c436fd7a3dfa7a12764cdac929c996187c (patch)
treed217de285910c78ee6fca66c6184c5501cc61588
parentd1094717a1bf22082587c9045111b47bd4351c9f (diff)
parente9ff4606449c075d464e667410392e23afab7a45 (diff)
Merge "Actually do not hold WM lock while closing transaction" into oc-dev
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimator.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java16
2 files changed, 20 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java
index aabf2bed1dd4..fe5b7f23d5e0 100644
--- a/services/core/java/com/android/server/wm/WindowAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowAnimator.java
@@ -228,7 +228,10 @@ public class WindowAnimator {
Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
} finally {
if (transactionOpen) {
- mService.closeSurfaceTransaction();
+
+ // Do not hold window manager lock while closing the transaction, as this might be
+ // blocking until the next frame, which can lead to total lock starvation.
+ mService.closeSurfaceTransaction(false /* withLockHeld */);
if (SHOW_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION animate");
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index e826aca5e2a7..947731efc221 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -893,10 +893,26 @@ public class WindowManagerService extends IWindowManager.Stub
}
void closeSurfaceTransaction() {
+ closeSurfaceTransaction(true /* withLockHeld */);
+ }
+
+ /**
+ * Closes a surface transaction.
+ *
+ * @param withLockHeld Whether to acquire the window manager while doing so. In some cases
+ * holding the lock my lead to starvation in WM in case closeTransaction
+ * blocks and we call it repeatedly, like we do for animations.
+ */
+ void closeSurfaceTransaction(boolean withLockHeld) {
synchronized (mWindowMap) {
if (mRoot.mSurfaceTraceEnabled) {
mRoot.mRemoteEventTrace.closeSurfaceTransaction();
}
+ if (withLockHeld) {
+ SurfaceControl.closeTransaction();
+ }
+ }
+ if (!withLockHeld) {
SurfaceControl.closeTransaction();
}
}