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

Commit 09ed24da authored by Mark Fasheh's avatar Mark Fasheh
Browse files

MessageQueue add isBlockedOnSyncBarrier()

Test: atest MessageQueueTest
Test: atest TestLooperManagerTest
Flag: android.os.message_queue_testability
Bug: 379472827
Change-Id: Ic6a754a5ea3faccd36e307c9d3716ee6aa3155ec
parent 283cd08f
Loading
Loading
Loading
Loading
+63 −0
Original line number Diff line number Diff line
@@ -1353,6 +1353,69 @@ public final class MessageQueue {
        }
    }

    /**
     * @return true if we are blocked on a sync barrier
     */
    boolean isBlockedOnSyncBarrier() {
        throwIfNotTest();
        if (mUseConcurrent) {
            Iterator<MessageNode> queueIter = mPriorityQueue.iterator();
            MessageNode queueNode = iterateNext(queueIter);

            if (queueNode.isBarrier()) {
                long now = SystemClock.uptimeMillis();

                /* Look for a deliverable async node. If one exists we are not blocked. */
                Iterator<MessageNode> asyncQueueIter = mAsyncPriorityQueue.iterator();
                MessageNode asyncNode = iterateNext(asyncQueueIter);
                if (asyncNode != null && now >= asyncNode.getWhen()) {
                    return false;
                }
                /*
                 * Look for a deliverable sync node. In this case, if one exists we are blocked
                 * since the barrier prevents delivery of the Message.
                 */
                while (queueNode.isBarrier()) {
                    queueNode = iterateNext(queueIter);
                }
                if (queueNode != null && now >= queueNode.getWhen()) {
                    return true;
                }

                return false;
            }
        } else {
            Message msg = mMessages;
            if (msg != null && msg.target == null) {
                Message iter = msg;
                /* Look for a deliverable async node */
                do {
                    iter = iter.next;
                } while (iter != null && !iter.isAsynchronous());

                long now = SystemClock.uptimeMillis();
                if (iter != null && now >= iter.when) {
                    return false;
                }
                /*
                 * Look for a deliverable sync node. In this case, if one exists we are blocked
                 * since the barrier prevents delivery of the Message.
                 */
                iter = msg;
                do {
                    iter = iter.next;
                } while (iter != null && (iter.target == null || iter.isAsynchronous()));

                if (iter != null && now >= iter.when) {
                    return true;
                }
                return false;
            }
        }
        /* No barrier was found. */
        return false;
    }

    private static final class MatchHandlerWhatAndObject extends MessageCompare {
        @Override
        public boolean compareMessage(MessageNode n, Handler h, int what, Object object, Runnable r,
+32 −0
Original line number Diff line number Diff line
@@ -1107,6 +1107,38 @@ public final class MessageQueue {
        return nextMessage(false);
    }

    /**
     * @return true if we are blocked on a sync barrier
     */
    boolean isBlockedOnSyncBarrier() {
        throwIfNotTest();
        Iterator<MessageNode> queueIter = mPriorityQueue.iterator();
        MessageNode queueNode = iterateNext(queueIter);

        if (queueNode.isBarrier()) {
            long now = SystemClock.uptimeMillis();

            /* Look for a deliverable async node. If one exists we are not blocked. */
            Iterator<MessageNode> asyncQueueIter = mAsyncPriorityQueue.iterator();
            MessageNode asyncNode = iterateNext(asyncQueueIter);
            if (asyncNode != null && now >= asyncNode.getWhen()) {
                return false;
            }
            /*
             * Look for a deliverable sync node. In this case, if one exists we are blocked
             * since the barrier prevents delivery of the Message.
             */
            while (queueNode.isBarrier()) {
                queueNode = iterateNext(queueIter);
            }
            if (queueNode != null && now >= queueNode.getWhen()) {
                return true;
            }

            return false;
        }
    }

    private StateNode getStateNode(StackNode node) {
        if (node.isMessageNode()) {
            return ((MessageNode) node).mBottomOfStack;
+34 −0
Original line number Diff line number Diff line
@@ -812,6 +812,40 @@ public final class MessageQueue {
        return legacyPeekOrPop(false);
    }

    /**
     * @return true if we are blocked on a sync barrier
     */
    boolean isBlockedOnSyncBarrier() {
        throwIfNotTest();
        Message msg = mMessages;
        if (msg != null && msg.target == null) {
            Message iter = msg;
            /* Look for a deliverable async node */
            do {
                iter = iter.next;
            } while (iter != null && !iter.isAsynchronous());

            long now = SystemClock.uptimeMillis();
            if (iter != null && now >= iter.when) {
                return false;
            }
            /*
                * Look for a deliverable sync node. In this case, if one exists we are blocked
                * since the barrier prevents delivery of the Message.
                */
            iter = msg;
            do {
                iter = iter.next;
            } while (iter != null && (iter.target == null || iter.isAsynchronous()));

            if (iter != null && now >= iter.when) {
                return true;
            }
            return false;
        }
        return false;
    }

    boolean hasMessages(Handler h, int what, Object object) {
        if (h == null) {
            return false;