From 63238fe68480ca6a3ecd31e6e3edb1c24c949e21 Mon Sep 17 00:00:00 2001 From: chaviw Date: Tue, 3 May 2022 14:36:40 -0500 Subject: [PATCH] Don't request sync again for reparented WC When a WC is reparented, a sync request can be initiated again to account for any config changes. However, this can cause deadlocks in the client since the app may already have produced a sync buffer and that buffer is now held in a sync transaction. The app can't produce any more buffers since it has ran out and just gets stuck waiting. The previous buffer will never get applied since BLASTSyncEngine is waiting for the next buffer to return from the sync request. Disable the second sync request for now and handle a real solution later. Test: No ANR in split gmail + messages on 60hz device Bug: 214320347 Change-Id: I5e11925de848781ddc34793f118b739703cc8ca2 --- .../java/com/android/server/wm/WindowContainer.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index c7bc51356c765..2f00bc821678b 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -3741,8 +3741,16 @@ class WindowContainer extends ConfigurationContainer< } // Otherwise this is the "root" of a synced subtree, so continue on to preparation. } + // This container's situation has changed so we need to restart its sync. - mSyncState = SYNC_STATE_NONE; + // We cannot reset the sync without a chance of a deadlock since it will request a new + // buffer from the app process. This could cause issues if the app has run out of buffers + // since the previous buffer was already synced and is still held in a transaction. + // Resetting syncState violates the policies outlined in BlastSyncEngine.md so for now + // disable this when shell transitions is disabled. + if (mTransitionController.isShellTransitionsEnabled()) { + mSyncState = SYNC_STATE_NONE; + } prepareSync(); }