diff options
-rw-r--r-- | power-libperfmgr/aidl/service.cpp | 17 | ||||
-rw-r--r-- | powerstats/DisplayStateResidencyDataProvider.cpp | 50 | ||||
-rw-r--r-- | powerstats/include/pixelpowerstats/DisplayStateResidencyDataProvider.h | 9 |
3 files changed, 37 insertions, 39 deletions
diff --git a/power-libperfmgr/aidl/service.cpp b/power-libperfmgr/aidl/service.cpp index aeb63564..5505524c 100644 --- a/power-libperfmgr/aidl/service.cpp +++ b/power-libperfmgr/aidl/service.cpp @@ -31,16 +31,21 @@ using aidl::google::hardware::power::impl::pixel::Power; using aidl::google::hardware::power::impl::pixel::PowerExt; using ::android::perfmgr::HintManager; -constexpr char kPowerHalConfigPath[] = "/vendor/etc/powerhint.json"; -constexpr char kPowerHalInitProp[] = "vendor.powerhal.init"; +constexpr std::string_view kPowerHalInitProp("vendor.powerhal.init"); +constexpr std::string_view kConfigProperty("vendor.powerhal.config"); +constexpr std::string_view kConfigDefaultFileName("powerhint.json"); int main() { - LOG(INFO) << "Pixel Power HAL AIDL Service with Extension is starting."; + const std::string config_path = + "/vendor/etc/" + + android::base::GetProperty(kConfigProperty.data(), kConfigDefaultFileName.data()); + LOG(INFO) << "Pixel Power HAL AIDL Service with Extension is starting with config: " + << config_path; // Parse config but do not start the looper - std::shared_ptr<HintManager> hm = HintManager::GetFromJSON(kPowerHalConfigPath, false); + std::shared_ptr<HintManager> hm = HintManager::GetFromJSON(config_path, false); if (!hm) { - LOG(FATAL) << "Invalid config: " << kPowerHalConfigPath; + LOG(FATAL) << "Invalid config: " << config_path; } std::shared_ptr<DisplayLowPower> dlpw = std::make_shared<DisplayLowPower>(); @@ -64,7 +69,7 @@ int main() { LOG(INFO) << "Pixel Power HAL AIDL Service with Extension is started."; std::thread initThread([&]() { - ::android::base::WaitForProperty(kPowerHalInitProp, "1"); + ::android::base::WaitForProperty(kPowerHalInitProp.data(), "1"); hm->Start(); dlpw->Init(); }); diff --git a/powerstats/DisplayStateResidencyDataProvider.cpp b/powerstats/DisplayStateResidencyDataProvider.cpp index 5b8b44ec..61af4780 100644 --- a/powerstats/DisplayStateResidencyDataProvider.cpp +++ b/powerstats/DisplayStateResidencyDataProvider.cpp @@ -35,13 +35,13 @@ namespace powerstats { DisplayStateResidencyDataProvider::DisplayStateResidencyDataProvider( uint32_t id, std::string path, std::vector<std::string> states) - : Thread(false), - mPath(std::move(path)), + : mPath(std::move(path)), mPowerEntityId(id), mStates(states), mCurState(-1), mLooper(new Looper(true)) { // Construct mResidencies + mResidencies.reserve(mStates.size()); for (uint32_t i = 0; i < mStates.size(); ++i) { PowerEntityStateResidencyData p = {.powerEntityStateId = i}; mResidencies.emplace_back(p); @@ -60,9 +60,7 @@ DisplayStateResidencyDataProvider::DisplayStateResidencyDataProvider( // Run the thread that will poll for changes to display state LOG(VERBOSE) << "Starting DisplayStateWatcherThread"; - if (run("DisplayStateWatcherThread", PRIORITY_HIGHEST) != NO_ERROR) { - LOG(ERROR) << "DisplayStateWatcherThread start fail"; - } + mThread = std::thread(&DisplayStateResidencyDataProvider::pollLoop, this); } DisplayStateResidencyDataProvider::~DisplayStateResidencyDataProvider() { @@ -76,23 +74,19 @@ bool DisplayStateResidencyDataProvider::getResults( std::scoped_lock lk(mLock); // Get current time since boot in milliseconds - uint64_t now = std::chrono::time_point_cast<std::chrono::milliseconds>( - android::base::boot_clock::now()) - .time_since_epoch() + uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>( + ::android::base::boot_clock::now().time_since_epoch()) .count(); // Construct residency result based on current residency data - PowerEntityStateResidencyResult result = {.powerEntityId = mPowerEntityId}; - result.stateResidencyData.resize(mStates.size()); - for (uint32_t i = 0; i < mResidencies.size(); ++i) { - result.stateResidencyData[i] = mResidencies[i]; - - // Account for time spent in current state - if (mCurState == i) { - result.stateResidencyData[i].totalTimeInStateMs += - now - result.stateResidencyData[i].lastEntryTimestampMs; - } + PowerEntityStateResidencyResult result = {.powerEntityId = mPowerEntityId, + .stateResidencyData = mResidencies}; + + if (mCurState > -1) { + result.stateResidencyData[mCurState].totalTimeInStateMs += + now - result.stateResidencyData[mCurState].lastEntryTimestampMs; } + results.emplace(mPowerEntityId, result); return true; } @@ -113,11 +107,9 @@ void DisplayStateResidencyDataProvider::updateStats() { char data[32]; // Get current time since boot in milliseconds - uint64_t now = std::chrono::time_point_cast<std::chrono::milliseconds>( - android::base::boot_clock::now()) - .time_since_epoch() + uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>( + ::android::base::boot_clock::now().time_since_epoch()) .count(); - // Read display state ssize_t ret = pread(mFd, data, sizeof(data) - 1, 0); if (ret < 0) { @@ -149,16 +141,16 @@ void DisplayStateResidencyDataProvider::updateStats() { } // release lock } -bool DisplayStateResidencyDataProvider::threadLoop() { +void DisplayStateResidencyDataProvider::pollLoop() { LOG(VERBOSE) << "DisplayStateResidencyDataProvider polling..."; - - // Poll for display state changes. Timeout set to poll indefinitely - if (mLooper->pollOnce(-1) >= 0) { - updateStats(); + while (true) { + // Poll for display state changes. Timeout set to poll indefinitely + if (mLooper->pollOnce(-1) >= 0) { + updateStats(); + } } - - return true; } + } // namespace powerstats } // namespace pixel } // namespace google diff --git a/powerstats/include/pixelpowerstats/DisplayStateResidencyDataProvider.h b/powerstats/include/pixelpowerstats/DisplayStateResidencyDataProvider.h index f6ffad2a..79de66c8 100644 --- a/powerstats/include/pixelpowerstats/DisplayStateResidencyDataProvider.h +++ b/powerstats/include/pixelpowerstats/DisplayStateResidencyDataProvider.h @@ -32,8 +32,7 @@ namespace google { namespace pixel { namespace powerstats { -class DisplayStateResidencyDataProvider : public IStateResidencyDataProvider, - public android::Thread { +class DisplayStateResidencyDataProvider : public IStateResidencyDataProvider { public: // id = powerEntityId to be associated with this data provider // path = path to the display state file descriptor @@ -46,8 +45,8 @@ class DisplayStateResidencyDataProvider : public IStateResidencyDataProvider, std::vector<PowerEntityStateSpace> getStateSpaces() override; private: - // The thread that will poll for display state changes - bool threadLoop() override; + // Poll for display state changes + void pollLoop(); // Main function to update the stats when display state change is detected void updateStats(); @@ -67,6 +66,8 @@ class DisplayStateResidencyDataProvider : public IStateResidencyDataProvider, int mCurState; // Looper to facilitate polling of display state file desciptor sp<Looper> mLooper; + + std::thread mThread; }; } // namespace powerstats |