| /* |
| * Copyright (C) 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * 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" |
| |
| namespace android { |
| |
| EventControlThread::~EventControlThread() = default; |
| |
| namespace impl { |
| |
| 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) { |
| std::lock_guard<std::mutex> lock(mMutex); |
| mVsyncEnabled = enabled; |
| mCondition.notify_all(); |
| } |
| |
| // Unfortunately std::unique_lock gives warnings with -Wthread-safety |
| void EventControlThread::threadMain() NO_THREAD_SAFETY_ANALYSIS { |
| auto keepRunning = true; |
| auto currentVsyncEnabled = 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 impl |
| } // namespace android |