From a4c0fc9a678c42fa0b852b0d2a4d2ba4cb12dd6e Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 30 Mar 2022 07:59:32 +0000 Subject: [PATCH] Cache OverContext to prevent deadlock There may be a deadlock if WMS is obtaining DisplayInfo during creating SystemUiContext on seconday display while PMS is querying current power state from DMS. This CL caches the OverlayContext used in LocalDisplayAdapter to prevent DMS from holding ActivityThread lock. fixes: 227308239 Test: atest LocalDisplayAdapterTest Change-Id: I41c44ea070673f048b49d108e029ae90d96645ad --- .../com/android/server/display/LocalDisplayAdapter.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 633cb24f64e90..77f540e83ed63 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -76,6 +76,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { private final boolean mIsBootDisplayModeSupported; + private Context mOverlayContext; + // Called with SyncRoot lock held. public LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context, Handler handler, Listener listener) { @@ -1222,7 +1224,10 @@ final class LocalDisplayAdapter extends DisplayAdapter { /** Supplies a context whose Resources apply runtime-overlays */ Context getOverlayContext() { - return ActivityThread.currentActivityThread().getSystemUiContext(); + if (mOverlayContext == null) { + mOverlayContext = ActivityThread.currentActivityThread().getSystemUiContext(); + } + return mOverlayContext; } /**