summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lee Shombert <shombert@google.com> 2025-01-16 09:04:35 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-16 09:04:35 -0800
commit2b7d92aa6ac8724660e8584e383334b02a21d9fe (patch)
tree3d0b52bd06cea6390702fe961635ce6af09239f0
parentfb6f500a69ca00bf7c251f5ff289ee0f8de33824 (diff)
parent94ee6d726a143ea40a574e3a45afe4aa1e022958 (diff)
Merge "Dispatch pending events outside a lock" into main
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java37
1 files changed, 20 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index ca001b9c7e6d..a37e9c3ac1b8 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -4382,26 +4382,29 @@ public final class DisplayManagerService extends SystemService {
// would be unusual to do so. The method returns true on success.
// This is only used if {@link deferDisplayEventsWhenFrozen()} is true.
public boolean dispatchPending() {
+ Event[] pending;
+ synchronized (mCallback) {
+ if (mPendingEvents == null || mPendingEvents.isEmpty() || !mAlive) {
+ return true;
+ }
+ if (!isReadyLocked()) {
+ return false;
+ }
+ pending = new Event[mPendingEvents.size()];
+ pending = mPendingEvents.toArray(pending);
+ mPendingEvents.clear();
+ }
try {
- synchronized (mCallback) {
- if (mPendingEvents == null || mPendingEvents.isEmpty() || !mAlive) {
- return true;
- }
- if (!isReadyLocked()) {
- return false;
- }
- for (int i = 0; i < mPendingEvents.size(); i++) {
- Event displayEvent = mPendingEvents.get(i);
- if (DEBUG) {
- Slog.d(TAG, "Send pending display event #" + i + " "
- + displayEvent.displayId + "/"
- + displayEvent.event + " to " + mUid + "/" + mPid);
- }
- transmitDisplayEvent(displayEvent.displayId, displayEvent.event);
+ for (int i = 0; i < pending.length; i++) {
+ Event displayEvent = pending[i];
+ if (DEBUG) {
+ Slog.d(TAG, "Send pending display event #" + i + " "
+ + displayEvent.displayId + "/"
+ + displayEvent.event + " to " + mUid + "/" + mPid);
}
- mPendingEvents.clear();
- return true;
+ transmitDisplayEvent(displayEvent.displayId, displayEvent.event);
}
+ return true;
} catch (RemoteException ex) {
Slog.w(TAG, "Failed to notify process "
+ mPid + " that display topology changed, assuming it died.", ex);