diff --git a/power-libperfmgr/PowerHintSession.cpp b/power-libperfmgr/PowerHintSession.cpp index 053aeda..e76d828 100644 --- a/power-libperfmgr/PowerHintSession.cpp +++ b/power-libperfmgr/PowerHintSession.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "PowerHintSession.h" #include "PowerSessionManager.h" @@ -238,8 +239,11 @@ ndk::ScopedAStatus PowerHintSession::resume() { } ndk::ScopedAStatus PowerHintSession::close() { + bool sessionClosedExpectedToBe = false; + if (!mSessionClosed.compare_exchange_strong(sessionClosedExpectedToBe, true)) { + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE); + } PowerHintMonitor::getInstance()->getLooper()->removeMessages(mStaleHandler); - // Reset to (0, 1024) uclamp value -- instead of threads' original setting. setUclamp(0); PowerSessionManager::getInstance()->removePowerSession(this); updateUniveralBoostMode(); diff --git a/power-libperfmgr/PowerHintSession.h b/power-libperfmgr/PowerHintSession.h index 6ad2652..e3c0f84 100644 --- a/power-libperfmgr/PowerHintSession.h +++ b/power-libperfmgr/PowerHintSession.h @@ -108,6 +108,7 @@ class PowerHintSession : public BnPowerHintSession { sp mPowerManagerHandler; std::mutex mLock; const nanoseconds kAdpfRate; + std::atomic mSessionClosed = false; }; } // namespace pixel