Loading services/inputflinger/dispatcher/InputDispatcher.cpp +18 −26 Original line number Diff line number Diff line Loading @@ -1038,7 +1038,7 @@ void InputDispatcher::dispatchEventLocked(nsecs_t currentTime, EventEntry* event pokeUserActivityLocked(*eventEntry); for (const InputTarget& inputTarget : inputTargets) { sp<Connection> connection = getConnectionLocked(inputTarget.inputChannel); sp<Connection> connection = getConnectionLocked(inputTarget.inputChannel->getToken()); if (connection != nullptr) { prepareDispatchCycleLocked(currentTime, connection, eventEntry, &inputTarget); } else { Loading Loading @@ -1126,7 +1126,7 @@ void InputDispatcher::removeWindowByTokenLocked(const sp<IBinder>& token) { } void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked( nsecs_t newTimeout, const sp<InputChannel>& inputChannel) { nsecs_t newTimeout, const sp<IBinder>& inputConnectionToken) { if (newTimeout > 0) { // Extend the timeout. mInputTargetWaitTimeoutTime = now() + newTimeout; Loading @@ -1135,13 +1135,9 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked( mInputTargetWaitTimeoutExpired = true; // Input state will not be realistic. Mark it out of sync. sp<Connection> connection = getConnectionLocked(inputChannel); sp<Connection> connection = getConnectionLocked(inputConnectionToken); if (connection != nullptr) { sp<IBinder> token = connection->inputChannel->getToken(); if (token != nullptr) { removeWindowByTokenLocked(token); } removeWindowByTokenLocked(inputConnectionToken); if (connection->status == Connection::STATUS_NORMAL) { CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, Loading Loading @@ -1828,8 +1824,7 @@ std::string InputDispatcher::checkWindowReadyForMoreInputLocked( } // If the window's connection is not registered then keep waiting. sp<Connection> connection = getConnectionLocked(getInputChannelLocked(windowHandle->getToken())); sp<Connection> connection = getConnectionLocked(windowHandle->getToken()); if (connection == nullptr) { return StringPrintf("Waiting because the %s window's input channel is not " "registered with the input dispatcher. The window may be in the " Loading Loading @@ -2477,7 +2472,7 @@ void InputDispatcher::synthesizeCancelationEventsForMonitorsLocked( void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked( const sp<InputChannel>& channel, const CancelationOptions& options) { sp<Connection> connection = getConnectionLocked(channel); sp<Connection> connection = getConnectionLocked(channel->getToken()); if (connection == nullptr) { return; } Loading Loading @@ -3571,10 +3566,8 @@ bool InputDispatcher::transferTouchFocus(const sp<IBinder>& fromToken, const sp< return false; } sp<InputChannel> fromChannel = getInputChannelLocked(fromToken); sp<InputChannel> toChannel = getInputChannelLocked(toToken); sp<Connection> fromConnection = getConnectionLocked(fromChannel); sp<Connection> toConnection = getConnectionLocked(toChannel); sp<Connection> fromConnection = getConnectionLocked(fromToken); sp<Connection> toConnection = getConnectionLocked(toToken); if (fromConnection != nullptr && toConnection != nullptr) { fromConnection->inputState.copyPointerStateTo(toConnection->inputState); CancelationOptions Loading Loading @@ -3873,7 +3866,7 @@ status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChan { // acquire lock std::scoped_lock _l(mLock); sp<Connection> existingConnection = getConnectionLocked(inputChannel); sp<Connection> existingConnection = getConnectionLocked(inputChannel->getToken()); if (existingConnection != nullptr) { ALOGW("Attempted to register already registered input channel '%s'", inputChannel->getName().c_str()); Loading Loading @@ -3948,7 +3941,7 @@ status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputCh status_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& inputChannel, bool notify) { sp<Connection> connection = getConnectionLocked(inputChannel); sp<Connection> connection = getConnectionLocked(inputChannel->getToken()); if (connection == nullptr) { ALOGW("Attempted to unregister already unregistered input channel '%s'", inputChannel->getName().c_str()); Loading Loading @@ -4056,14 +4049,14 @@ std::optional<int32_t> InputDispatcher::findGestureMonitorDisplayByTokenLocked( return std::nullopt; } sp<Connection> InputDispatcher::getConnectionLocked(const sp<InputChannel>& inputChannel) { if (inputChannel == nullptr) { sp<Connection> InputDispatcher::getConnectionLocked(const sp<IBinder>& inputConnectionToken) { if (inputConnectionToken == nullptr) { return nullptr; } for (const auto& pair : mConnectionsByFd) { sp<Connection> connection = pair.second; if (connection->inputChannel->getToken() == inputChannel->getToken()) { const sp<Connection>& connection = pair.second; if (connection->inputChannel->getToken() == inputConnectionToken) { return connection; } } Loading Loading @@ -4171,17 +4164,16 @@ void InputDispatcher::doNotifyFocusChangedLockedInterruptible(CommandEntry* comm } void InputDispatcher::doNotifyANRLockedInterruptible(CommandEntry* commandEntry) { sp<IBinder> token = commandEntry->inputChannel ? commandEntry->inputChannel->getToken() : nullptr; mLock.unlock(); nsecs_t newTimeout = mPolicy->notifyANR(commandEntry->inputApplicationHandle, commandEntry->inputChannel ? commandEntry->inputChannel->getToken() : nullptr, commandEntry->reason); mPolicy->notifyANR(commandEntry->inputApplicationHandle, token, commandEntry->reason); mLock.lock(); resumeAfterTargetsNotReadyTimeoutLocked(newTimeout, commandEntry->inputChannel); resumeAfterTargetsNotReadyTimeoutLocked(newTimeout, token); } void InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible( Loading services/inputflinger/dispatcher/InputDispatcher.h +2 −2 Original line number Diff line number Diff line Loading @@ -183,7 +183,7 @@ private: std::optional<int32_t> findGestureMonitorDisplayByTokenLocked(const sp<IBinder>& token) REQUIRES(mLock); sp<Connection> getConnectionLocked(const sp<InputChannel>& inputChannel) REQUIRES(mLock); sp<Connection> getConnectionLocked(const sp<IBinder>& inputConnectionToken) REQUIRES(mLock); // Input channels that will receive a copy of all input events sent to the provided display. std::unordered_map<int32_t, std::vector<Monitor>> mGlobalMonitorsByDisplay GUARDED_BY(mLock); Loading Loading @@ -322,7 +322,7 @@ private: void removeWindowByTokenLocked(const sp<IBinder>& token) REQUIRES(mLock); void resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout, const sp<InputChannel>& inputChannel) const sp<IBinder>& inputConnectionToken) REQUIRES(mLock); nsecs_t getTimeSpentWaitingForApplicationLocked(nsecs_t currentTime) REQUIRES(mLock); void resetANRTimeoutsLocked() REQUIRES(mLock); Loading Loading
services/inputflinger/dispatcher/InputDispatcher.cpp +18 −26 Original line number Diff line number Diff line Loading @@ -1038,7 +1038,7 @@ void InputDispatcher::dispatchEventLocked(nsecs_t currentTime, EventEntry* event pokeUserActivityLocked(*eventEntry); for (const InputTarget& inputTarget : inputTargets) { sp<Connection> connection = getConnectionLocked(inputTarget.inputChannel); sp<Connection> connection = getConnectionLocked(inputTarget.inputChannel->getToken()); if (connection != nullptr) { prepareDispatchCycleLocked(currentTime, connection, eventEntry, &inputTarget); } else { Loading Loading @@ -1126,7 +1126,7 @@ void InputDispatcher::removeWindowByTokenLocked(const sp<IBinder>& token) { } void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked( nsecs_t newTimeout, const sp<InputChannel>& inputChannel) { nsecs_t newTimeout, const sp<IBinder>& inputConnectionToken) { if (newTimeout > 0) { // Extend the timeout. mInputTargetWaitTimeoutTime = now() + newTimeout; Loading @@ -1135,13 +1135,9 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked( mInputTargetWaitTimeoutExpired = true; // Input state will not be realistic. Mark it out of sync. sp<Connection> connection = getConnectionLocked(inputChannel); sp<Connection> connection = getConnectionLocked(inputConnectionToken); if (connection != nullptr) { sp<IBinder> token = connection->inputChannel->getToken(); if (token != nullptr) { removeWindowByTokenLocked(token); } removeWindowByTokenLocked(inputConnectionToken); if (connection->status == Connection::STATUS_NORMAL) { CancelationOptions options(CancelationOptions::CANCEL_ALL_EVENTS, Loading Loading @@ -1828,8 +1824,7 @@ std::string InputDispatcher::checkWindowReadyForMoreInputLocked( } // If the window's connection is not registered then keep waiting. sp<Connection> connection = getConnectionLocked(getInputChannelLocked(windowHandle->getToken())); sp<Connection> connection = getConnectionLocked(windowHandle->getToken()); if (connection == nullptr) { return StringPrintf("Waiting because the %s window's input channel is not " "registered with the input dispatcher. The window may be in the " Loading Loading @@ -2477,7 +2472,7 @@ void InputDispatcher::synthesizeCancelationEventsForMonitorsLocked( void InputDispatcher::synthesizeCancelationEventsForInputChannelLocked( const sp<InputChannel>& channel, const CancelationOptions& options) { sp<Connection> connection = getConnectionLocked(channel); sp<Connection> connection = getConnectionLocked(channel->getToken()); if (connection == nullptr) { return; } Loading Loading @@ -3571,10 +3566,8 @@ bool InputDispatcher::transferTouchFocus(const sp<IBinder>& fromToken, const sp< return false; } sp<InputChannel> fromChannel = getInputChannelLocked(fromToken); sp<InputChannel> toChannel = getInputChannelLocked(toToken); sp<Connection> fromConnection = getConnectionLocked(fromChannel); sp<Connection> toConnection = getConnectionLocked(toChannel); sp<Connection> fromConnection = getConnectionLocked(fromToken); sp<Connection> toConnection = getConnectionLocked(toToken); if (fromConnection != nullptr && toConnection != nullptr) { fromConnection->inputState.copyPointerStateTo(toConnection->inputState); CancelationOptions Loading Loading @@ -3873,7 +3866,7 @@ status_t InputDispatcher::registerInputChannel(const sp<InputChannel>& inputChan { // acquire lock std::scoped_lock _l(mLock); sp<Connection> existingConnection = getConnectionLocked(inputChannel); sp<Connection> existingConnection = getConnectionLocked(inputChannel->getToken()); if (existingConnection != nullptr) { ALOGW("Attempted to register already registered input channel '%s'", inputChannel->getName().c_str()); Loading Loading @@ -3948,7 +3941,7 @@ status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputCh status_t InputDispatcher::unregisterInputChannelLocked(const sp<InputChannel>& inputChannel, bool notify) { sp<Connection> connection = getConnectionLocked(inputChannel); sp<Connection> connection = getConnectionLocked(inputChannel->getToken()); if (connection == nullptr) { ALOGW("Attempted to unregister already unregistered input channel '%s'", inputChannel->getName().c_str()); Loading Loading @@ -4056,14 +4049,14 @@ std::optional<int32_t> InputDispatcher::findGestureMonitorDisplayByTokenLocked( return std::nullopt; } sp<Connection> InputDispatcher::getConnectionLocked(const sp<InputChannel>& inputChannel) { if (inputChannel == nullptr) { sp<Connection> InputDispatcher::getConnectionLocked(const sp<IBinder>& inputConnectionToken) { if (inputConnectionToken == nullptr) { return nullptr; } for (const auto& pair : mConnectionsByFd) { sp<Connection> connection = pair.second; if (connection->inputChannel->getToken() == inputChannel->getToken()) { const sp<Connection>& connection = pair.second; if (connection->inputChannel->getToken() == inputConnectionToken) { return connection; } } Loading Loading @@ -4171,17 +4164,16 @@ void InputDispatcher::doNotifyFocusChangedLockedInterruptible(CommandEntry* comm } void InputDispatcher::doNotifyANRLockedInterruptible(CommandEntry* commandEntry) { sp<IBinder> token = commandEntry->inputChannel ? commandEntry->inputChannel->getToken() : nullptr; mLock.unlock(); nsecs_t newTimeout = mPolicy->notifyANR(commandEntry->inputApplicationHandle, commandEntry->inputChannel ? commandEntry->inputChannel->getToken() : nullptr, commandEntry->reason); mPolicy->notifyANR(commandEntry->inputApplicationHandle, token, commandEntry->reason); mLock.lock(); resumeAfterTargetsNotReadyTimeoutLocked(newTimeout, commandEntry->inputChannel); resumeAfterTargetsNotReadyTimeoutLocked(newTimeout, token); } void InputDispatcher::doInterceptKeyBeforeDispatchingLockedInterruptible( Loading
services/inputflinger/dispatcher/InputDispatcher.h +2 −2 Original line number Diff line number Diff line Loading @@ -183,7 +183,7 @@ private: std::optional<int32_t> findGestureMonitorDisplayByTokenLocked(const sp<IBinder>& token) REQUIRES(mLock); sp<Connection> getConnectionLocked(const sp<InputChannel>& inputChannel) REQUIRES(mLock); sp<Connection> getConnectionLocked(const sp<IBinder>& inputConnectionToken) REQUIRES(mLock); // Input channels that will receive a copy of all input events sent to the provided display. std::unordered_map<int32_t, std::vector<Monitor>> mGlobalMonitorsByDisplay GUARDED_BY(mLock); Loading Loading @@ -322,7 +322,7 @@ private: void removeWindowByTokenLocked(const sp<IBinder>& token) REQUIRES(mLock); void resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout, const sp<InputChannel>& inputChannel) const sp<IBinder>& inputConnectionToken) REQUIRES(mLock); nsecs_t getTimeSpentWaitingForApplicationLocked(nsecs_t currentTime) REQUIRES(mLock); void resetANRTimeoutsLocked() REQUIRES(mLock); Loading