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

Commit abed74c8 authored by Jeff Brown's avatar Jeff Brown Committed by Android (Google) Code Review
Browse files

Merge "Fix race condition in fallback key processing."

parents 0049d8aa 7999039b
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -908,6 +908,7 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout
            ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);
            if (connectionIndex >= 0) {
                sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);
                if (connection->status == Connection::STATUS_NORMAL) {
                    synthesizeCancelationEventsForConnectionLocked(
                            connection, InputState::CANCEL_ALL_EVENTS,
                            "application not responding");
@@ -915,6 +916,7 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout
            }
        }
    }
}

nsecs_t InputDispatcher::getTimeSpentWaitingForApplicationLocked(
        nsecs_t currentTime) {
@@ -3056,7 +3058,7 @@ void InputDispatcher::doDispatchCycleFinishedLockedInterruptible(
                    // the original UP in which case we would not generate the fallback UP.
                    synthesizeCancelationEventsForConnectionLocked(connection,
                            InputState::CANCEL_FALLBACK_EVENTS,
                            "Application handled a non-fallback event.");
                            "application handled a non-fallback event, canceling all fallback events");
                } else {
                    // If the application did not handle a non-fallback key, then ask
                    // the policy what to do with it.  We might generate a fallback key
@@ -3071,6 +3073,12 @@ void InputDispatcher::doDispatchCycleFinishedLockedInterruptible(

                    mLock.lock();

                    if (connection->status != Connection::STATUS_NORMAL) {
                        return;
                    }

                    assert(connection->outboundQueue.headSentinel.next == dispatchEntry);

                    if (fallback) {
                        // Restart the dispatch cycle using the fallback key.
                        keyEntry->eventTime = event.getEventTime();