Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5e56dde authored by Obi Okafor's avatar Obi Okafor Committed by Joe Onorato
Browse files

Fix for deadlock between StatusBarService and NotificationManagerService

A ServerThread holding a lock on mQueue in StatusBarService invoked a
callback in NotificationManagerService which required a lock on
mNotificationList. At  the same time, a BinderThread holding a lock on
mNotificationList was attempting to post a message to StatusBarService
which requires lock on mQueue. The fix is to release the lock on mQueue
in handleMessage() before running the actions at the end of the method.
parent aa773543
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -557,15 +557,17 @@ public class StatusBarService extends IStatusBar.Stub
                doRevealAnimation();
                return;
            }
            boolean expand = false;
            boolean doExpand = false;
            boolean doDisable = false;
            int disableWhat = 0;

            synchronized (mQueue) {
                boolean wasExpanded = mExpanded;

                // for each one in the queue, find all of the ones with the same key
                // and collapse that down into a final op and/or call to setVisibility, etc
                boolean expand = wasExpanded;
                boolean doExpand = false;
                boolean doDisable = false;
                int disableWhat = 0;
                expand = wasExpanded;
                int N = mQueue.size();
                while (N > 0) {
                    PendingOp op = mQueue.get(0);
@@ -639,6 +641,10 @@ public class StatusBarService extends IStatusBar.Stub
                if (mQueue.size() != 0) {
                    throw new RuntimeException("Assertion failed: mQueue.size=" + mQueue.size());
                }
            }
            // This must be done outside the synchronized block above to prevent a deadlock where
            // we call into the NotificationManagerService and it is in turn attempting to post a
            // message to our queue.
            if (doExpand) {
                // this is last so that we capture all of the pending changes before doing it
                if (expand) {
@@ -652,7 +658,6 @@ public class StatusBarService extends IStatusBar.Stub
            }
        }
    }
    }

    private boolean alwaysHandle(int code) {
        return code == OP_DISABLE;