SF: Update InputFlinger outside main thread
Avoids parceling data inside main thread and hot path. Also
avoids any binder contention with one way binder calls. See
bug for more details.
Bug: 206380307
Test: presubmit
Test: systrace
Change-Id: I4f8640587c821ac471559f1e6d2fbe41a8e64c87
diff --git a/services/surfaceflinger/BackgroundExecutor.cpp b/services/surfaceflinger/BackgroundExecutor.cpp
index 3663cdb..de8e6b3 100644
--- a/services/surfaceflinger/BackgroundExecutor.cpp
+++ b/services/surfaceflinger/BackgroundExecutor.cpp
@@ -32,7 +32,9 @@
std::vector<std::function<void()>> tasks;
{
std::unique_lock lock(mMutex);
- mWorkAvailableCv.wait(lock, [&]() { return mDone || !mTasks.empty(); });
+ android::base::ScopedLockAssertion assumeLock(mMutex);
+ mWorkAvailableCv.wait(lock,
+ [&]() REQUIRES(mMutex) { return mDone || !mTasks.empty(); });
tasks = std::move(mTasks);
mTasks.clear();
done = mDone;
@@ -47,7 +49,7 @@
BackgroundExecutor::~BackgroundExecutor() {
{
- std::unique_lock lock(mMutex);
+ std::scoped_lock lock(mMutex);
mDone = true;
mWorkAvailableCv.notify_all();
}
@@ -57,7 +59,7 @@
}
void BackgroundExecutor::execute(std::function<void()> task) {
- std::unique_lock lock(mMutex);
+ std::scoped_lock lock(mMutex);
mTasks.emplace_back(std::move(task));
mWorkAvailableCv.notify_all();
}