diff options
author | 2024-09-19 17:42:42 -0700 | |
---|---|---|
committer | 2024-09-19 18:20:35 -0700 | |
commit | f53fa6b562d6608197329b94e796012e18d11dc7 (patch) | |
tree | ab99b0ab224f796864bb5a0bf3fbbfd9c9eba1ff | |
parent | ec741152d29c44b91bd56abb3e848c97887509d7 (diff) |
Only prioritize critical input threads
Input has several threads:
InputReader
InputClassifier (InputProcessor)
InputDispatcher
InputFilter
TraceProcessor
However, only two of them are in the critical path of the event
dispatch, and therefore, should be prioritized.
The others do not need to run with high priority.
In this CL, require that all InputThread's declare themselves as
critical or not, which would allow us to set their priority
appropriately.
Bug: 330719044
Test: perfetto trace
Flag: EXEMPT bugfix
Change-Id: Iaa7d7ed32557e1617884590562c3474b17d3a7f9
-rw-r--r-- | services/inputflinger/InputFilterCallbacks.cpp | 3 | ||||
-rw-r--r-- | services/inputflinger/InputThread.cpp | 7 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/InputDispatcher.cpp | 3 | ||||
-rw-r--r-- | services/inputflinger/dispatcher/trace/ThreadedBackend.cpp | 2 | ||||
-rw-r--r-- | services/inputflinger/include/InputThread.h | 4 | ||||
-rw-r--r-- | services/inputflinger/reader/InputReader.cpp | 3 |
6 files changed, 13 insertions, 9 deletions
diff --git a/services/inputflinger/InputFilterCallbacks.cpp b/services/inputflinger/InputFilterCallbacks.cpp index 5fbdc84c4b..493459acfb 100644 --- a/services/inputflinger/InputFilterCallbacks.cpp +++ b/services/inputflinger/InputFilterCallbacks.cpp @@ -44,7 +44,8 @@ public: InputFilterThread(std::shared_ptr<IInputThreadCallback> callback) : mCallback(callback) { mLooper = sp<Looper>::make(/*allowNonCallbacks=*/false); mThread = std::make_unique<InputThread>( - "InputFilter", [this]() { loopOnce(); }, [this]() { mLooper->wake(); }); + "InputFilter", [this]() { loopOnce(); }, [this]() { mLooper->wake(); }, + /*isInCriticalPath=*/false); } ndk::ScopedAStatus finish() override { diff --git a/services/inputflinger/InputThread.cpp b/services/inputflinger/InputThread.cpp index 449eb45b4b..bd4b192e22 100644 --- a/services/inputflinger/InputThread.cpp +++ b/services/inputflinger/InputThread.cpp @@ -45,11 +45,12 @@ private: } // namespace -InputThread::InputThread(std::string name, std::function<void()> loop, std::function<void()> wake) +InputThread::InputThread(std::string name, std::function<void()> loop, std::function<void()> wake, + bool isInCriticalPath) : mName(name), mThreadWake(wake) { mThread = sp<InputThreadImpl>::make(loop); mThread->run(mName.c_str(), ANDROID_PRIORITY_URGENT_DISPLAY); - if (input_flags::enable_input_policy_profile()) { + if (input_flags::enable_input_policy_profile() && isInCriticalPath) { if (!applyInputEventProfile()) { LOG(ERROR) << "Couldn't apply input policy profile for " << name; } @@ -84,4 +85,4 @@ bool InputThread::applyInputEventProfile() { #endif } -} // namespace android
\ No newline at end of file +} // namespace android diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index 75b494bfd1..0be107de2b 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -981,7 +981,8 @@ status_t InputDispatcher::start() { return ALREADY_EXISTS; } mThread = std::make_unique<InputThread>( - "InputDispatcher", [this]() { dispatchOnce(); }, [this]() { mLooper->wake(); }); + "InputDispatcher", [this]() { dispatchOnce(); }, [this]() { mLooper->wake(); }, + /*isInCriticalPath=*/true); return OK; } diff --git a/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp b/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp index 3c3c15a64c..4f61885162 100644 --- a/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp +++ b/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp @@ -41,7 +41,7 @@ ThreadedBackend<Backend>::ThreadedBackend(Backend&& innerBackend) : mBackend(std::move(innerBackend)), mTracerThread( "InputTracer", [this]() { threadLoop(); }, - [this]() { mThreadWakeCondition.notify_all(); }) {} + [this]() { mThreadWakeCondition.notify_all(); }, /*isInCriticalPath=*/false) {} template <typename Backend> ThreadedBackend<Backend>::~ThreadedBackend() { diff --git a/services/inputflinger/include/InputThread.h b/services/inputflinger/include/InputThread.h index fcd913db7c..595f5a2b9e 100644 --- a/services/inputflinger/include/InputThread.h +++ b/services/inputflinger/include/InputThread.h @@ -28,8 +28,8 @@ namespace android { */ class InputThread { public: - explicit InputThread(std::string name, std::function<void()> loop, - std::function<void()> wake = nullptr); + explicit InputThread(std::string name, std::function<void()> loop, std::function<void()> wake, + bool isInCriticalPath); virtual ~InputThread(); bool isCallingThread(); diff --git a/services/inputflinger/reader/InputReader.cpp b/services/inputflinger/reader/InputReader.cpp index a5b12490a3..a6f5df7593 100644 --- a/services/inputflinger/reader/InputReader.cpp +++ b/services/inputflinger/reader/InputReader.cpp @@ -122,7 +122,8 @@ status_t InputReader::start() { return ALREADY_EXISTS; } mThread = std::make_unique<InputThread>( - "InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); }); + "InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); }, + /*isInCriticalPath=*/true); return OK; } |