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

Commit 09a82bae authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Ensure dispose is always called on looper thread

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.

Bug: 376713684
Test: atest InputEventSenderAndReceiverTest
Flag: EXEMPT refactor
Change-Id: Ib2bb401f32bc2f8521c53920d6e47825c9301603
parent 0d2f511b
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()
    }