From d2280b81070a084559cbe7ce184dc89cead5073a Mon Sep 17 00:00:00 2001 From: jiayongqiang Date: Fri, 10 Dec 2021 16:20:05 +0800 Subject: [PATCH] Fix deadlock issue. It might cause deadlock sometimes: The locking order of setEventsMask is: registerDisplayListener -> -> setEventsMask -> ; The Locking order of handleMessage is: Looper.loop -> Looper.loopOnce -> Handler.dispatchMessage -> handleMessage -> ; Therefore, when the registerDisplayListener is called by client, the DisplayListenerDelegate.handleMessage also called by DMS's callback, at this time, if the method with DMG.mLock is called in handleMessage(), it will lead to deadlock. Test: (For example) Thread A: DisplayListenerDelegate.handleMessage() -> DisplayListener.onDisplayChanged() -> DMG.getCompatibleDisplay() -> DMG.getDisplayInfo() -> Thead B: DMG.registerDisplayListener() -> -> DisplayListenerDelegate.setEventsMask() -> Signed-off-by: jiayongqiang Change-Id: Ie1a8728339c16fa8f4c4f5c758821c836fa1c96b --- .../java/android/hardware/display/DisplayManagerGlobal.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index a9b95fce87778..5c30b36ab0997 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -908,7 +908,7 @@ public final class DisplayManagerGlobal { private static final class DisplayListenerDelegate extends Handler { public final DisplayListener mListener; - public long mEventsMask; + public volatile long mEventsMask; private final DisplayInfo mDisplayInfo = new DisplayInfo(); @@ -928,12 +928,12 @@ public final class DisplayManagerGlobal { removeCallbacksAndMessages(null); } - public synchronized void setEventsMask(@EventsMask long newEventsMask) { + public void setEventsMask(@EventsMask long newEventsMask) { mEventsMask = newEventsMask; } @Override - public synchronized void handleMessage(Message msg) { + public void handleMessage(Message msg) { switch (msg.what) { case EVENT_DISPLAY_ADDED: if ((mEventsMask & DisplayManager.EVENT_FLAG_DISPLAY_ADDED) != 0) {