summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--power-libperfmgr/aidl/service.cpp17
-rw-r--r--powerstats/DisplayStateResidencyDataProvider.cpp50
-rw-r--r--powerstats/include/pixelpowerstats/DisplayStateResidencyDataProvider.h9
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