summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/EventControlThread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/EventControlThread.cpp')
-rw-r--r--services/surfaceflinger/EventControlThread.cpp70
1 files changed, 41 insertions, 29 deletions
diff --git a/services/surfaceflinger/EventControlThread.cpp b/services/surfaceflinger/EventControlThread.cpp
index 6fd4cdf28e..ac54059360 100644
--- a/services/surfaceflinger/EventControlThread.cpp
+++ b/services/surfaceflinger/EventControlThread.cpp
@@ -14,45 +14,57 @@
* limitations under the License.
*/
+#include <pthread.h>
+#include <sched.h>
+#include <sys/resource.h>
+
+#include <cutils/sched_policy.h>
+#include <log/log.h>
+#include <system/thread_defs.h>
+
#include "EventControlThread.h"
-#include "SurfaceFlinger.h"
namespace android {
-EventControlThread::EventControlThread(const sp<SurfaceFlinger>& flinger)
- : mFlinger(flinger), mVsyncEnabled(false) {}
+EventControlThread::EventControlThread(EventControlThread::SetVSyncEnabledFunction function)
+ : mSetVSyncEnabled(function) {
+ pthread_setname_np(mThread.native_handle(), "EventControlThread");
+
+ pid_t tid = pthread_gettid_np(mThread.native_handle());
+ setpriority(PRIO_PROCESS, tid, ANDROID_PRIORITY_URGENT_DISPLAY);
+ set_sched_policy(tid, SP_FOREGROUND);
+}
+
+EventControlThread::~EventControlThread() {
+ {
+ std::lock_guard<std::mutex> lock(mMutex);
+ mKeepRunning = false;
+ mCondition.notify_all();
+ }
+ mThread.join();
+}
void EventControlThread::setVsyncEnabled(bool enabled) {
- Mutex::Autolock lock(mMutex);
+ std::lock_guard<std::mutex> lock(mMutex);
mVsyncEnabled = enabled;
- mCond.signal();
+ mCondition.notify_all();
}
-bool EventControlThread::threadLoop() {
- enum class VsyncState { Unset, On, Off };
- auto currentVsyncState = VsyncState::Unset;
-
- while (true) {
- auto requestedVsyncState = VsyncState::On;
- {
- Mutex::Autolock lock(mMutex);
- requestedVsyncState = mVsyncEnabled ? VsyncState::On : VsyncState::Off;
- while (currentVsyncState == requestedVsyncState) {
- status_t err = mCond.wait(mMutex);
- if (err != NO_ERROR) {
- ALOGE("error waiting for new events: %s (%d)", strerror(-err), err);
- return false;
- }
- requestedVsyncState = mVsyncEnabled ? VsyncState::On : VsyncState::Off;
- }
- }
-
- bool enable = requestedVsyncState == VsyncState::On;
- mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, enable);
- currentVsyncState = requestedVsyncState;
- }
+// Unfortunately std::unique_lock gives warnings with -Wthread-safety
+void EventControlThread::threadMain() NO_THREAD_SAFETY_ANALYSIS {
+ auto keepRunning = true;
+ auto currentVsyncEnabled = false;
- return false;
+ while (keepRunning) {
+ mSetVSyncEnabled(currentVsyncEnabled);
+
+ std::unique_lock<std::mutex> lock(mMutex);
+ mCondition.wait(lock, [this, currentVsyncEnabled, keepRunning]() NO_THREAD_SAFETY_ANALYSIS {
+ return currentVsyncEnabled != mVsyncEnabled || keepRunning != mKeepRunning;
+ });
+ currentVsyncEnabled = mVsyncEnabled;
+ keepRunning = mKeepRunning;
+ }
}
} // namespace android