diff options
| author | 2017-06-15 06:11:10 +0000 | |
|---|---|---|
| committer | 2017-06-15 06:11:15 +0000 | |
| commit | 7831f0c436fd7a3dfa7a12764cdac929c996187c (patch) | |
| tree | d217de285910c78ee6fca66c6184c5501cc61588 | |
| parent | d1094717a1bf22082587c9045111b47bd4351c9f (diff) | |
| parent | e9ff4606449c075d464e667410392e23afab7a45 (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.java | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowManagerService.java | 16 |
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(); } } |