diff options
author | 2020-06-30 14:22:57 -0500 | |
---|---|---|
committer | 2020-07-08 11:18:37 -0500 | |
commit | c1ae5568e5d6b39499f0c46e7f5ae2a8759d2ecd (patch) | |
tree | 01190a4ef30d2cde65568abd84d528b7f36c226b | |
parent | c945c8cb4846b172fa992e260abec29b5f6ea461 (diff) |
Use chrono for dispatching timeout
To prevent confusion about the units of dispatchingTimeout, convert to
chrono.
Bug: 155931890
Test: atest inputflinger_tests
Change-Id: Icfcb3bad7188052a6b047b3cbe836be8d928fad2
-rw-r--r-- | include/input/InputApplication.h | 6 | ||||
-rw-r--r-- | include/input/InputWindow.h | 6 | ||||
-rw-r--r-- | libs/gui/tests/EndToEndNativeInputTest.cpp | 4 | ||||
-rw-r--r-- | libs/input/InputApplication.cpp | 6 | ||||
-rw-r--r-- | libs/input/InputWindow.cpp | 4 | ||||
-rw-r--r-- | libs/input/tests/InputWindow_test.cpp | 4 | ||||
-rw-r--r-- | services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp | 40 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/InputDispatcher.cpp | 34 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/InputDispatcher.h | 4 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h | 5 | ||||
-rw-r--r-- | services/inputflinger/tests/InputDispatcher_test.cpp | 15 |
11 files changed, 61 insertions, 67 deletions
diff --git a/include/input/InputApplication.h b/include/input/InputApplication.h index 86de394a31..ccffeb1327 100644 --- a/include/input/InputApplication.h +++ b/include/input/InputApplication.h @@ -34,7 +34,7 @@ namespace android { struct InputApplicationInfo { sp<IBinder> token; std::string name; - nsecs_t dispatchingTimeout; + std::chrono::nanoseconds dispatchingTimeout; status_t write(Parcel& output) const; static InputApplicationInfo read(const Parcel& from); @@ -57,10 +57,6 @@ public: return !mInfo.name.empty() ? mInfo.name : "<invalid>"; } - inline nsecs_t getDispatchingTimeout(nsecs_t defaultValue) const { - return mInfo.token ? mInfo.dispatchingTimeout : defaultValue; - } - inline std::chrono::nanoseconds getDispatchingTimeout( std::chrono::nanoseconds defaultValue) const { return mInfo.token ? std::chrono::nanoseconds(mInfo.dispatchingTimeout) : defaultValue; diff --git a/include/input/InputWindow.h b/include/input/InputWindow.h index 6740855791..f8c759c85d 100644 --- a/include/input/InputWindow.h +++ b/include/input/InputWindow.h @@ -136,7 +136,7 @@ struct InputWindowInfo { std::string name; int32_t layoutParamsFlags = 0; int32_t layoutParamsType = 0; - nsecs_t dispatchingTimeout = -1; + std::chrono::nanoseconds dispatchingTimeout = std::chrono::seconds(5); /* These values are filled in by SurfaceFlinger. */ int32_t frameLeft = -1; @@ -227,10 +227,6 @@ public: return !mInfo.name.empty() ? mInfo.name : "<invalid>"; } - inline nsecs_t getDispatchingTimeout(nsecs_t defaultValue) const { - return mInfo.token ? mInfo.dispatchingTimeout : defaultValue; - } - inline std::chrono::nanoseconds getDispatchingTimeout( std::chrono::nanoseconds defaultValue) const { return mInfo.token ? std::chrono::nanoseconds(mInfo.dispatchingTimeout) : defaultValue; diff --git a/libs/gui/tests/EndToEndNativeInputTest.cpp b/libs/gui/tests/EndToEndNativeInputTest.cpp index b1d3ecbf36..32c7fc2588 100644 --- a/libs/gui/tests/EndToEndNativeInputTest.cpp +++ b/libs/gui/tests/EndToEndNativeInputTest.cpp @@ -189,7 +189,7 @@ private: mInputInfo.name = "Test info"; mInputInfo.layoutParamsFlags = InputWindowInfo::FLAG_NOT_TOUCH_MODAL; mInputInfo.layoutParamsType = InputWindowInfo::TYPE_BASE_APPLICATION; - mInputInfo.dispatchingTimeout = seconds_to_nanoseconds(5); + mInputInfo.dispatchingTimeout = 5s; mInputInfo.globalScaleFactor = 1.0; mInputInfo.canReceiveKeys = true; mInputInfo.hasFocus = true; @@ -207,7 +207,7 @@ private: InputApplicationInfo aInfo; aInfo.token = new BBinder(); aInfo.name = "Test app info"; - aInfo.dispatchingTimeout = seconds_to_nanoseconds(5); + aInfo.dispatchingTimeout = 5s; mInputInfo.applicationInfo = aInfo; } diff --git a/libs/input/InputApplication.cpp b/libs/input/InputApplication.cpp index 1d9f8a7091..c745c24c66 100644 --- a/libs/input/InputApplication.cpp +++ b/libs/input/InputApplication.cpp @@ -34,7 +34,7 @@ InputApplicationInfo InputApplicationInfo::read(const Parcel& from) { InputApplicationInfo ret; ret.token = from.readStrongBinder(); ret.name = from.readString8().c_str(); - ret.dispatchingTimeout = from.readInt64(); + ret.dispatchingTimeout = decltype(ret.dispatchingTimeout)(from.readInt64()); return ret; } @@ -42,8 +42,8 @@ InputApplicationInfo InputApplicationInfo::read(const Parcel& from) { status_t InputApplicationInfo::write(Parcel& output) const { output.writeStrongBinder(token); output.writeString8(String8(name.c_str())); - output.writeInt64(dispatchingTimeout); - + output.writeInt64(dispatchingTimeout.count()); + return OK; } diff --git a/libs/input/InputWindow.cpp b/libs/input/InputWindow.cpp index 04550227e3..3700e8f0f8 100644 --- a/libs/input/InputWindow.cpp +++ b/libs/input/InputWindow.cpp @@ -177,7 +177,7 @@ status_t InputWindowInfo::write(Parcel& output) const { output.writeString8(String8(name.c_str())); output.writeInt32(layoutParamsFlags); output.writeInt32(layoutParamsType); - output.writeInt64(dispatchingTimeout); + output.writeInt64(dispatchingTimeout.count()); output.writeInt32(frameLeft); output.writeInt32(frameTop); output.writeInt32(frameRight); @@ -216,7 +216,7 @@ InputWindowInfo InputWindowInfo::read(const Parcel& from) { ret.name = from.readString8().c_str(); ret.layoutParamsFlags = from.readInt32(); ret.layoutParamsType = from.readInt32(); - ret.dispatchingTimeout = from.readInt64(); + ret.dispatchingTimeout = decltype(ret.dispatchingTimeout)(from.readInt64()); ret.frameLeft = from.readInt32(); ret.frameTop = from.readInt32(); ret.frameRight = from.readInt32(); diff --git a/libs/input/tests/InputWindow_test.cpp b/libs/input/tests/InputWindow_test.cpp index d1cb527a57..87505323c3 100644 --- a/libs/input/tests/InputWindow_test.cpp +++ b/libs/input/tests/InputWindow_test.cpp @@ -22,6 +22,8 @@ #include <input/InputWindow.h> #include <input/InputTransport.h> +using std::chrono_literals::operator""s; + namespace android { namespace test { @@ -44,7 +46,7 @@ TEST(InputWindowInfo, Parcelling) { i.name = "Foobar"; i.layoutParamsFlags = 7; i.layoutParamsType = 39; - i.dispatchingTimeout = 12; + i.dispatchingTimeout = 12s; i.frameLeft = 93; i.frameTop = 34; i.frameRight = 16; diff --git a/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp b/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp index 5a14133eb2..7d8ab753f3 100644 --- a/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp +++ b/services/inputflinger/benchmarks/InputDispatcher_benchmarks.cpp @@ -45,49 +45,45 @@ protected: virtual ~FakeInputDispatcherPolicy() {} private: - virtual void notifyConfigurationChanged(nsecs_t) override {} + void notifyConfigurationChanged(nsecs_t) override {} - virtual nsecs_t notifyAnr(const sp<InputApplicationHandle>&, const sp<IBinder>&, - const std::string& name) override { + std::chrono::nanoseconds notifyAnr(const sp<InputApplicationHandle>&, const sp<IBinder>&, + const std::string& name) override { ALOGE("The window is not responding : %s", name.c_str()); - return 0; + return 0s; } - virtual void notifyInputChannelBroken(const sp<IBinder>&) override {} + void notifyInputChannelBroken(const sp<IBinder>&) override {} - virtual void notifyFocusChanged(const sp<IBinder>&, const sp<IBinder>&) override {} + void notifyFocusChanged(const sp<IBinder>&, const sp<IBinder>&) override {} - virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) override { + void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) override { *outConfig = mConfig; } - virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) override { + bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) override { return true; } - virtual void interceptKeyBeforeQueueing(const KeyEvent*, uint32_t&) override {} + void interceptKeyBeforeQueueing(const KeyEvent*, uint32_t&) override {} - virtual void interceptMotionBeforeQueueing(int32_t, nsecs_t, uint32_t&) override {} + void interceptMotionBeforeQueueing(int32_t, nsecs_t, uint32_t&) override {} - virtual nsecs_t interceptKeyBeforeDispatching(const sp<IBinder>&, const KeyEvent*, - uint32_t) override { + nsecs_t interceptKeyBeforeDispatching(const sp<IBinder>&, const KeyEvent*, uint32_t) override { return 0; } - virtual bool dispatchUnhandledKey(const sp<IBinder>&, const KeyEvent*, uint32_t, - KeyEvent*) override { + bool dispatchUnhandledKey(const sp<IBinder>&, const KeyEvent*, uint32_t, KeyEvent*) override { return false; } - virtual void notifySwitch(nsecs_t, uint32_t, uint32_t, uint32_t) override {} + void notifySwitch(nsecs_t, uint32_t, uint32_t, uint32_t) override {} - virtual void pokeUserActivity(nsecs_t, int32_t) override {} + void pokeUserActivity(nsecs_t, int32_t) override {} - virtual bool checkInjectEventsPermissionNonReentrant(int32_t, int32_t) override { - return false; - } + bool checkInjectEventsPermissionNonReentrant(int32_t, int32_t) override { return false; } - virtual void onPointerDownOutsideFocus(const sp<IBinder>& newToken) override {} + void onPointerDownOutsideFocus(const sp<IBinder>& newToken) override {} InputDispatcherConfiguration mConfig; }; @@ -98,7 +94,7 @@ public: virtual ~FakeApplicationHandle() {} virtual bool updateInfo() { - mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT.count(); + mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT; return true; } }; @@ -163,7 +159,7 @@ public: mInfo.name = "FakeWindowHandle"; mInfo.layoutParamsFlags = 0; mInfo.layoutParamsType = InputWindowInfo::TYPE_APPLICATION; - mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT.count(); + mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT; mInfo.frameLeft = mFrame.left; mInfo.frameTop = mFrame.top; mInfo.frameRight = mFrame.right; diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index 14f7caf671..0fa2332e40 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -159,6 +159,10 @@ static bool isValidMotionAction(int32_t action, int32_t actionButton, int32_t po } } +static int64_t millis(std::chrono::nanoseconds t) { + return std::chrono::duration_cast<std::chrono::milliseconds>(t).count(); +} + static bool validateMotionEvent(int32_t action, int32_t actionButton, size_t pointerCount, const PointerProperties* pointerProperties) { if (!isValidMotionAction(action, actionButton, pointerCount)) { @@ -1473,13 +1477,13 @@ int32_t InputDispatcher::findFocusedWindowTargetsLocked(nsecs_t currentTime, if (focusedWindowHandle == nullptr && focusedApplicationHandle != nullptr) { if (!mNoFocusedWindowTimeoutTime.has_value()) { // We just discovered that there's no focused window. Start the ANR timer - const nsecs_t timeout = focusedApplicationHandle->getDispatchingTimeout( - DEFAULT_INPUT_DISPATCHING_TIMEOUT.count()); - mNoFocusedWindowTimeoutTime = currentTime + timeout; + std::chrono::nanoseconds timeout = focusedApplicationHandle->getDispatchingTimeout( + DEFAULT_INPUT_DISPATCHING_TIMEOUT); + mNoFocusedWindowTimeoutTime = currentTime + timeout.count(); mAwaitedFocusedApplication = focusedApplicationHandle; ALOGW("Waiting because no window has focus but %s may eventually add a " "window when it finishes starting up. Will wait for %" PRId64 "ms", - mAwaitedFocusedApplication->getName().c_str(), ns2ms(timeout)); + mAwaitedFocusedApplication->getName().c_str(), millis(timeout)); *nextWakeupTime = *mNoFocusedWindowTimeoutTime; return INPUT_EVENT_INJECTION_PENDING; } else if (currentTime > *mNoFocusedWindowTimeoutTime) { @@ -4063,13 +4067,11 @@ void InputDispatcher::dumpDispatchStateLocked(std::string& dump) { for (auto& it : mFocusedApplicationHandlesByDisplay) { const int32_t displayId = it.first; const sp<InputApplicationHandle>& applicationHandle = it.second; + const int64_t timeoutMillis = millis( + applicationHandle->getDispatchingTimeout(DEFAULT_INPUT_DISPATCHING_TIMEOUT)); dump += StringPrintf(INDENT2 "displayId=%" PRId32 ", name='%s', dispatchingTimeout=%" PRId64 "ms\n", - displayId, applicationHandle->getName().c_str(), - ns2ms(applicationHandle - ->getDispatchingTimeout( - DEFAULT_INPUT_DISPATCHING_TIMEOUT) - .count())); + displayId, applicationHandle->getName().c_str(), timeoutMillis); } } else { dump += StringPrintf(INDENT "FocusedApplications: <none>\n"); @@ -4152,7 +4154,7 @@ void InputDispatcher::dumpDispatchStateLocked(std::string& dump) { dump += StringPrintf(", ownerPid=%d, ownerUid=%d, dispatchingTimeout=%" PRId64 "ms\n", windowInfo->ownerPid, windowInfo->ownerUid, - ns2ms(windowInfo->dispatchingTimeout)); + millis(windowInfo->dispatchingTimeout)); dump += StringPrintf(INDENT4 " flags: %s\n", inputWindowFlagsToString(windowInfo->layoutParamsFlags) .c_str()); @@ -4653,12 +4655,12 @@ void InputDispatcher::doNotifyAnrLockedInterruptible(CommandEntry* commandEntry) commandEntry->inputChannel ? commandEntry->inputChannel->getConnectionToken() : nullptr; mLock.unlock(); - const nsecs_t timeoutExtension = + const std::chrono::nanoseconds timeoutExtension = mPolicy->notifyAnr(commandEntry->inputApplicationHandle, token, commandEntry->reason); mLock.lock(); - if (timeoutExtension > 0) { + if (timeoutExtension > 0s) { extendAnrTimeoutsLocked(commandEntry->inputApplicationHandle, token, timeoutExtension); } else { // stop waking up for events in this connection, it is already not responding @@ -4672,12 +4674,12 @@ void InputDispatcher::doNotifyAnrLockedInterruptible(CommandEntry* commandEntry) void InputDispatcher::extendAnrTimeoutsLocked(const sp<InputApplicationHandle>& application, const sp<IBinder>& connectionToken, - nsecs_t timeoutExtension) { + std::chrono::nanoseconds timeoutExtension) { sp<Connection> connection = getConnectionLocked(connectionToken); if (connection == nullptr) { if (mNoFocusedWindowTimeoutTime.has_value() && application != nullptr) { // Maybe ANR happened because there's no focused window? - mNoFocusedWindowTimeoutTime = now() + timeoutExtension; + mNoFocusedWindowTimeoutTime = now() + timeoutExtension.count(); mAwaitedFocusedApplication = application; } else { // It's also possible that the connection already disappeared. No action necessary. @@ -4686,10 +4688,10 @@ void InputDispatcher::extendAnrTimeoutsLocked(const sp<InputApplicationHandle>& } ALOGI("Raised ANR, but the policy wants to keep waiting on %s for %" PRId64 "ms longer", - connection->inputChannel->getName().c_str(), ns2ms(timeoutExtension)); + connection->inputChannel->getName().c_str(), millis(timeoutExtension)); connection->responsive = true; - const nsecs_t newTimeout = now() + timeoutExtension; + const nsecs_t newTimeout = now() + timeoutExtension.count(); for (DispatchEntry* entry : connection->waitQueue) { if (newTimeout >= entry->timeoutTime) { // Already removed old entries when connection was marked unresponsive diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h index e679c6b06f..42583bcabe 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.h +++ b/services/inputflinger/dispatcher/InputDispatcher.h @@ -374,8 +374,8 @@ private: // prevent unneeded wakeups. AnrTracker mAnrTracker GUARDED_BY(mLock); void extendAnrTimeoutsLocked(const sp<InputApplicationHandle>& application, - const sp<IBinder>& connectionToken, nsecs_t timeoutExtension) - REQUIRES(mLock); + const sp<IBinder>& connectionToken, + std::chrono::nanoseconds timeoutExtension) REQUIRES(mLock); // Contains the last window which received a hover event. sp<InputWindowHandle> mLastHoverWindowHandle GUARDED_BY(mLock); diff --git a/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h b/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h index 667af9bbd8..21255dd0d6 100644 --- a/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h +++ b/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h @@ -47,8 +47,9 @@ public: /* Notifies the system that an application is not responding. * Returns a new timeout to continue waiting, or 0 to abort dispatch. */ - virtual nsecs_t notifyAnr(const sp<InputApplicationHandle>& inputApplicationHandle, - const sp<IBinder>& token, const std::string& reason) = 0; + virtual std::chrono::nanoseconds notifyAnr( + const sp<InputApplicationHandle>& inputApplicationHandle, const sp<IBinder>& token, + const std::string& reason) = 0; /* Notifies the system that an input channel is unrecoverably broken. */ virtual void notifyInputChannelBroken(const sp<IBinder>& token) = 0; diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index ea4d885ed5..cf5a3ab32c 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -198,13 +198,14 @@ private: mConfigurationChangedTime = when; } - virtual nsecs_t notifyAnr(const sp<InputApplicationHandle>& application, - const sp<IBinder>& windowToken, const std::string&) override { + std::chrono::nanoseconds notifyAnr(const sp<InputApplicationHandle>& application, + const sp<IBinder>& windowToken, + const std::string&) override { std::scoped_lock lock(mLock); mAnrApplications.push(application); mAnrWindowTokens.push(windowToken); mNotifyAnr.notify_all(); - return mAnrTimeout.count(); + return mAnrTimeout; } virtual void notifyInputChannelBroken(const sp<IBinder>&) override {} @@ -585,7 +586,7 @@ public: FakeApplicationHandle() { mInfo.name = "Fake Application"; mInfo.token = new BBinder(); - mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT.count(); + mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT; } virtual ~FakeApplicationHandle() {} @@ -594,7 +595,7 @@ public: } void setDispatchingTimeout(std::chrono::nanoseconds timeout) { - mInfo.dispatchingTimeout = timeout.count(); + mInfo.dispatchingTimeout = timeout; } }; @@ -767,7 +768,7 @@ public: mInfo.name = name; mInfo.layoutParamsFlags = 0; mInfo.layoutParamsType = InputWindowInfo::TYPE_APPLICATION; - mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT.count(); + mInfo.dispatchingTimeout = DISPATCHING_TIMEOUT; mInfo.frameLeft = 0; mInfo.frameTop = 0; mInfo.frameRight = WIDTH; @@ -791,7 +792,7 @@ public: void setFocus(bool hasFocus) { mInfo.hasFocus = hasFocus; } void setDispatchingTimeout(std::chrono::nanoseconds timeout) { - mInfo.dispatchingTimeout = timeout.count(); + mInfo.dispatchingTimeout = timeout; } void setPaused(bool paused) { mInfo.paused = paused; } |