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

Commit 30ce3fab authored by Shai Barack's avatar Shai Barack
Browse files

Remove some MessageNode methods

This is a step towards storing Message directly in the queue
rather than storing MessageNode, in order to peel an indirection layer
and improve queue performance.

Bug: 415954362
Flag: build.RELEASE_PACKAGE_MESSAGEQUEUE_IMPLEMENTATION
Change-Id: I6d858931a47db3dfe57f62e4b973b8178309a2e2
parent a7f98d7a
Loading
Loading
Loading
Loading
+24 −32
Original line number Diff line number Diff line
@@ -304,6 +304,10 @@ public final class MessageQueue {
        return 0;
    }

    private static boolean isBarrier(MessageNode msgNode) {
        return msgNode != null && msgNode.mMessage.target == null;
    }

    static final class MatchDeliverableMessages extends MessageCompare {
        @Override
        public boolean compareMessage(MessageNode n, Handler h, int what, Object object, Runnable r,
@@ -322,12 +326,12 @@ public final class MessageQueue {
        }

        final MessageNode msgNode = first(mPriorityQueue);
        if (msgNode != null && msgNode.getWhen() <= now) {
        if (msgNode != null && msgNode.mMessage.when <= now) {
            return false;
        }

        final MessageNode asyncMsgNode = first(mAsyncPriorityQueue);
        if (asyncMsgNode != null && asyncMsgNode.getWhen() <= now) {
        if (asyncMsgNode != null && asyncMsgNode.mMessage.when <= now) {
            return false;
        }

@@ -755,7 +759,7 @@ public final class MessageQueue {
                            + " what: " + msg.what
                            + " when: " + msg.when
                            + " seq: " + msgNode.mMessage.insertSeq
                            + " barrier: " + msgNode.isBarrier()
                            + " barrier: " + isBarrier(msgNode)
                            + " now: " + now);
                }
                if (asyncMsgNode != null) {
@@ -764,7 +768,7 @@ public final class MessageQueue {
                            + " what: " + msg.what
                            + " when: " + msg.when
                            + " seq: " + asyncMsgNode.mMessage.insertSeq
                            + " barrier: " + asyncMsgNode.isBarrier()
                            + " barrier: " + isBarrier(asyncMsgNode)
                            + " now: " + now);
                }
            }
@@ -784,8 +788,8 @@ public final class MessageQueue {
            /*
             * If we have a barrier we should return the async node (if it exists and is ready)
             */
            if (msgNode != null && msgNode.isBarrier()) {
                if (asyncMsgNode != null && (returnEarliest || now >= asyncMsgNode.getWhen())) {
            if (isBarrier(msgNode)) {
                if (asyncMsgNode != null && (returnEarliest || now >= asyncMsgNode.mMessage.when)) {
                    found = asyncMsgNode;
                } else {
                    next = asyncMsgNode;
@@ -799,7 +803,7 @@ public final class MessageQueue {
                earliest = pickEarliestNode(msgNode, asyncMsgNode);

                if (earliest != null) {
                    if (returnEarliest || now >= earliest.getWhen()) {
                    if (returnEarliest || now >= earliest.mMessage.when) {
                        found = earliest;
                    } else {
                        next = earliest;
@@ -814,8 +818,8 @@ public final class MessageQueue {
                            + " what: " + msg.what
                            + " when: " + msg.when
                            + " seq: " + found.mMessage.insertSeq
                            + " barrier: " + found.isBarrier()
                            + " async: " + found.isAsync()
                            + " barrier: " + isBarrier(found)
                            + " async: " + found.mMessage.isAsynchronous()
                            + " now: " + now);
                } else {
                    Log.d(TAG_C, "No node to deliver");
@@ -826,8 +830,8 @@ public final class MessageQueue {
                            + " what: " + msg.what
                            + " when: " + msg.when
                            + " seq: " + next.mMessage.insertSeq
                            + " barrier: " + next.isBarrier()
                            + " async: " + next.isAsync()
                            + " barrier: " + isBarrier(next)
                            + " async: " + next.mMessage.isAsynchronous()
                            + " now: " + now);
                } else {
                    Log.d(TAG_C, "No next node");
@@ -854,7 +858,7 @@ public final class MessageQueue {
                    }
                } else {
                    /* Message not ready, or we found one to deliver already, set a timeout */
                    long nextMessageWhen = next.getWhen();
                    long nextMessageWhen = next.mMessage.when;
                    if (nextMessageWhen > now) {
                        mNextPollTimeoutMillis = (int) Math.min(nextMessageWhen - now,
                                Integer.MAX_VALUE);
@@ -1546,7 +1550,7 @@ public final class MessageQueue {

            MessageNode queueNode = first(mPriorityQueue);

            return (queueNode != null && queueNode.isBarrier());
            return (isBarrier(queueNode));
        } else {
            Message msg = mMessages;
            return msg != null && msg.target == null;
@@ -2432,7 +2436,7 @@ public final class MessageQueue {
     */
    /* Helper to choose the correct queue to insert into. */
    private void insertIntoPriorityQueue(MessageNode msgNode) {
        if (msgNode.isAsync()) {
        if (msgNode.mMessage.isAsynchronous()) {
            mAsyncPriorityQueue.add(msgNode);
        } else {
            mPriorityQueue.add(msgNode);
@@ -2440,7 +2444,7 @@ public final class MessageQueue {
    }

    private boolean removeFromPriorityQueue(MessageNode msgNode) {
        if (msgNode.isAsync()) {
        if (msgNode.mMessage.isAsynchronous()) {
            return mAsyncPriorityQueue.remove(msgNode);
        } else {
            return mPriorityQueue.remove(msgNode);
@@ -2608,7 +2612,7 @@ public final class MessageQueue {
    }

    static final class MessageNode extends StackNode {
        private final Message mMessage;
        final Message mMessage;
        volatile StackNode mNext;
        StateNode mBottomOfStack;
        boolean mWokeUp;
@@ -2631,21 +2635,9 @@ public final class MessageQueue {
            message.insertSeq = insertSeq;
        }

        long getWhen() {
            return mMessage.when;
        }

        boolean removeFromStack() {
            return sRemovedFromStack.compareAndSet(this, false, true);
        }

        boolean isAsync() {
            return mMessage.isAsynchronous();
        }

        boolean isBarrier() {
            return mMessage.target == null;
        }
    }

    static class StateNode extends StackNode {
@@ -2929,8 +2921,8 @@ public final class MessageQueue {
                    + " what: " + msg.what
                    + " when: " + msg.when
                    + " seq: " + node.mMessage.insertSeq
                    + " barrier: " + node.isBarrier()
                    + " async: " + node.isAsync()
                    + " barrier: " + isBarrier(node)
                    + " async: " + node.mMessage.isAsynchronous()
                    + " now: " + SystemClock.uptimeMillis());
        }

@@ -2987,7 +2979,7 @@ public final class MessageQueue {
                case STACK_NODE_TIMEDPARK:
                    node.mBottomOfStack = (StateNode) old;
                    inactive = true;
                    wakeNeeded = mStackStateTimedPark.mWhenToWake >= node.getWhen();
                    wakeNeeded = mStackStateTimedPark.mWhenToWake >= node.mMessage.when;
                    node.mWokeUp = wakeNeeded;
                    break;

@@ -3005,7 +2997,7 @@ public final class MessageQueue {
                    int bottomType = node.mBottomOfStack.getNodeType();
                    inactive = bottomType >= STACK_NODE_PARKED;
                    wakeNeeded = (bottomType == STACK_NODE_TIMEDPARK
                            && mStackStateTimedPark.mWhenToWake >= node.getWhen()
                            && mStackStateTimedPark.mWhenToWake >= node.mMessage.when
                            && !oldMessage.mWokeUp);
                    node.mWokeUp = oldMessage.mWokeUp || wakeNeeded;
                    break;