Improvements to SF's BackgroundExcecutor.
- stop using utils/Singleton.h (it's marked as DO NOT USE)
- add a low priority instance
- explicitly set the thread priorities for both the HP and LP instances.
Test: manual, libsurfaceflinger_unittest
Bug: http://b/336461947
Change-Id: Ie10f663ed43aad21ba2a5235cd86a1101dec0cd7
diff --git a/services/surfaceflinger/BackgroundExecutor.cpp b/services/surfaceflinger/BackgroundExecutor.cpp
index 5a1ec6f..3cef875 100644
--- a/services/surfaceflinger/BackgroundExecutor.cpp
+++ b/services/surfaceflinger/BackgroundExecutor.cpp
@@ -19,6 +19,9 @@
#define LOG_TAG "BackgroundExecutor"
#define ATRACE_TAG ATRACE_TAG_GRAPHICS
+#include <processgroup/sched_policy.h>
+#include <pthread.h>
+#include <sched.h>
#include <utils/Log.h>
#include <mutex>
@@ -26,14 +29,24 @@
namespace android {
-ANDROID_SINGLETON_STATIC_INSTANCE(BackgroundExecutor);
+namespace {
-BackgroundExecutor::BackgroundExecutor() : Singleton<BackgroundExecutor>() {
+void set_thread_priority(bool highPriority) {
+ set_sched_policy(0, highPriority ? SP_FOREGROUND : SP_BACKGROUND);
+ struct sched_param param = {0};
+ param.sched_priority = highPriority ? 2 : 0 /* must be 0 for non-RT */;
+ sched_setscheduler(gettid(), highPriority ? SCHED_FIFO : SCHED_NORMAL, ¶m);
+}
+
+} // anonymous namespace
+
+BackgroundExecutor::BackgroundExecutor(bool highPriority) {
// mSemaphore must be initialized before any calls to
// BackgroundExecutor::sendCallbacks. For this reason, we initialize it
// within the constructor instead of within mThread.
LOG_ALWAYS_FATAL_IF(sem_init(&mSemaphore, 0, 0), "sem_init failed");
- mThread = std::thread([&]() {
+ mThread = std::thread([&, highPriority]() {
+ set_thread_priority(highPriority);
while (!mDone) {
LOG_ALWAYS_FATAL_IF(sem_wait(&mSemaphore), "sem_wait failed (%d)", errno);
auto callbacks = mCallbacksQueue.pop();
@@ -45,6 +58,11 @@
}
}
});
+ if (highPriority) {
+ pthread_setname_np(mThread.native_handle(), "BckgrndExec HP");
+ } else {
+ pthread_setname_np(mThread.native_handle(), "BckgrndExec LP");
+ }
}
BackgroundExecutor::~BackgroundExecutor() {