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

Commit e35eb553 authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

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

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

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 third attempt, after finding a bunch of issues in the postsubmit on first and second attempts.

This reverts commit e6392025.

Reason for revert: attempting again

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