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

Commit 5a6537eb authored by Siarhei Vishniakou's avatar Siarhei Vishniakou Committed by Android (Google) Code Review
Browse files

Ensure dispose is always called on looper thread -- try 2

The InputEventReceiver::dispose should only be called on the looper
thread. This is already documented in the class, but not enforce.

Enforce this here, since this will become critical in subsequent patches
where we are relying on the ability to consume upon dispose.

This is the second attempt, after finding a bunch of issues in the postsubmit.

Bug: 376713684
Test: atest InputEventSenderAndReceiverTest
Flag: EXEMPT refactor
Change-Id: I2484f17491cf5f9afba5ec68f759595ccf3329ce
parent 36647777
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ public abstract class InputEventReceiver {
    // We keep references to the input channel and message queue objects here so that
    // they are not GC'd while the native peer of the receiver is using them.
    private InputChannel mInputChannel;
    private MessageQueue mMessageQueue;
    private Looper mLooper;

    // Map from InputEvent sequence numbers to dispatcher sequence numbers.
    private final SparseIntArray mSeqMap = new SparseIntArray();
@@ -76,9 +76,9 @@ public abstract class InputEventReceiver {
        }

        mInputChannel = inputChannel;
        mMessageQueue = looper.getQueue();
        mLooper = looper;
        mReceiverPtr = nativeInit(new WeakReference<InputEventReceiver>(this),
                mInputChannel, mMessageQueue);
                mInputChannel, mLooper.getQueue());

        mCloseGuard.open("InputEventReceiver.dispose");
    }
@@ -108,6 +108,9 @@ public abstract class InputEventReceiver {
     * Must be called on the same Looper thread to which the receiver is attached.
     */
    public void dispose() {
        if (Thread.currentThread() != mLooper.getThread()) {
            throw new IllegalStateException("Must call dispose() on the Looper thread");
        }
        dispose(false);
    }

@@ -128,7 +131,7 @@ public abstract class InputEventReceiver {
            mInputChannel.dispose();
            mInputChannel = null;
        }
        mMessageQueue = null;
        mLooper = null;
        Reference.reachabilityFence(this);
    }

+0 −1
Original line number Diff line number Diff line
@@ -155,7 +155,6 @@ class InputEventSenderAndReceiverTest {
        sender.assertReceivedFinishedSignal(seq, handled = true)

        // Clean up
        crashingReceiver.dispose()
        sender.dispose()
        receiverThread.quitSafely()
    }