diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-26 01:11:29 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-04-26 01:11:29 +0000 |
commit | a8405ea988ce657bb91947522127133362fd4cd8 (patch) | |
tree | 28bfd4a3132103c24f7608c766901b0664d53735 | |
parent | 484997260df1d7f432461af289aead399704dd7f (diff) | |
parent | 20b039192d90f6dcbce3905cfe108c5ba8205440 (diff) | |
download | gs-common-android13-s1-release.tar.gz |
Snap for 8498890 from 20b039192d90f6dcbce3905cfe108c5ba8205440 to tm-releaseandroid-vts-13.0_r8android-vts-13.0_r7android-vts-13.0_r6android-vts-13.0_r5android-vts-13.0_r4android-vts-13.0_r3android-vts-13.0_r2android-vts-13.0_r1android-security-13.0.0_r9android-security-13.0.0_r8android-security-13.0.0_r7android-security-13.0.0_r6android-security-13.0.0_r5android-security-13.0.0_r4android-security-13.0.0_r3android-security-13.0.0_r2android-security-13.0.0_r17android-security-13.0.0_r16android-security-13.0.0_r15android-security-13.0.0_r14android-security-13.0.0_r13android-security-13.0.0_r12android-security-13.0.0_r11android-security-13.0.0_r10android-security-13.0.0_r1android-cts-13.0_r8android-cts-13.0_r7android-cts-13.0_r6android-cts-13.0_r5android-cts-13.0_r4android-cts-13.0_r3android-cts-13.0_r2android-cts-13.0_r1android-13.0.0_r8android-13.0.0_r7android-13.0.0_r6android-13.0.0_r5android-13.0.0_r4android-13.0.0_r31android-13.0.0_r3android-13.0.0_r2android-13.0.0_r12android-13.0.0_r1android13-tests-releaseandroid13-security-releaseandroid13-s3-releaseandroid13-s2-releaseandroid13-s1-releaseandroid13-release
Change-Id: If11702749342b0d2275a9a50290360d4306d2870
-rw-r--r-- | powerstats/AocStateResidencyDataProvider.cpp | 98 | ||||
-rw-r--r-- | powerstats/include/AocStateResidencyDataProvider.h | 7 |
2 files changed, 9 insertions, 96 deletions
diff --git a/powerstats/AocStateResidencyDataProvider.cpp b/powerstats/AocStateResidencyDataProvider.cpp index 574a23d..c64496d 100644 --- a/powerstats/AocStateResidencyDataProvider.cpp +++ b/powerstats/AocStateResidencyDataProvider.cpp @@ -17,8 +17,6 @@ #include "AocStateResidencyDataProvider.h" #include <android-base/logging.h> -#include <chrono> -#include <pthread.h> namespace aidl { namespace android { @@ -26,23 +24,12 @@ namespace hardware { namespace power { namespace stats { -struct async_data_t { - pthread_cond_t *cond; - pthread_mutex_t *lock; - uint64_t timeoutMillis; - std::unordered_map<std::string, std::vector<StateResidency>> *residencies; - std::unordered_map<std::string, - std::vector<std::unique_ptr<GenericStateResidencyDataProvider>>> *providers; -}; - AocStateResidencyDataProvider::AocStateResidencyDataProvider(std::vector<std::pair<std::string, - std::string>> ids, std::vector<std::pair<std::string, std::string>> states, - const uint64_t timeoutMillis) { + std::string>> ids, std::vector<std::pair<std::string, std::string>> states) { // AoC stats are reported in ticks of 244.140625ns. The transform // function converts ticks to milliseconds. // 1000000 / 244.140625 = 4096. static const uint64_t AOC_CLK = 4096; - static const uint64_t TIMEOUT_MILLIS = 120; std::function<uint64_t(uint64_t)> aocTickToMs = [](uint64_t a) { return a / AOC_CLK; }; GenericStateResidencyDataProvider::StateResidencyConfig config = { .entryCountSupported = true, @@ -67,17 +54,13 @@ AocStateResidencyDataProvider::AocStateResidencyDataProvider(std::vector<std::pa mProviders[id.first].push_back(std::move(sdp)); } } - mStateCount = states.size(); - mTimeoutMillis = timeoutMillis == 0 ? TIMEOUT_MILLIS : timeoutMillis; } -void *getStateResidenciesAsync(void *arg) { - struct timespec start, end; - struct async_data_t *async = (struct async_data_t*)arg; - uint64_t timeoutUs = async->timeoutMillis * 1000; - +bool AocStateResidencyDataProvider::getStateResidencies( + std::unordered_map<std::string, std::vector<StateResidency>> *residencies) { // States from the same power entity are merged. - for (const auto &providerList : *async->providers) { + bool ret = true; + for (const auto &providerList : mProviders) { int32_t stateId = 0; std::string curEntity = providerList.first; std::vector<StateResidency> stateResidencies; @@ -85,18 +68,7 @@ void *getStateResidenciesAsync(void *arg) { // Iterate over each provider in the providerList, appending each of the states for (const auto &provider : providerList.second) { std::unordered_map<std::string, std::vector<StateResidency>> residency; - - clock_gettime(CLOCK_REALTIME, &start); - provider->getStateResidencies(&residency); - clock_gettime(CLOCK_REALTIME, &end); - uint64_t elapsedUs = - ((end.tv_sec - start.tv_sec) * 1000000) + ((end.tv_nsec - start.tv_nsec) / 1000); - - if (elapsedUs >= timeoutUs) { - LOG(WARNING) << "getStateResidencies latency for " << curEntity - << " exceeds time allowed: " << elapsedUs << " us"; - return 0; - } + ret &= provider->getStateResidencies(&residency); // Each provider should only return data for curEntity but checking anyway if (residency.find(curEntity) != residency.end()) { @@ -112,64 +84,8 @@ void *getStateResidenciesAsync(void *arg) { } } - async->residencies->emplace(curEntity, stateResidencies); + residencies->emplace(curEntity, stateResidencies); } - - pthread_mutex_lock(async->lock); - pthread_cond_signal(async->cond); - pthread_mutex_unlock(async->lock); - - return 0; -} - -bool AocStateResidencyDataProvider::getStateResidencies( - std::unordered_map<std::string, std::vector<StateResidency>> *residencies) { - bool ret = true; - int condResult = 0; - pthread_t tid; - pthread_cond_t cond = PTHREAD_COND_INITIALIZER; - pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; - std::unordered_map<std::string, std::vector<StateResidency>> stateResidencies; - struct timespec start, timeout; - struct async_data_t async = { - .cond = &cond, - .lock = &lock, - .timeoutMillis = mTimeoutMillis, - .residencies = &stateResidencies, - .providers = &mProviders - }; - - pthread_create(&tid, NULL, &getStateResidenciesAsync, (void*)&async); - - clock_gettime(CLOCK_REALTIME, &start); - - uint64_t expirationMillis = mTimeoutMillis * mStateCount; - timeout.tv_sec = start.tv_sec + expirationMillis / 1000; - uint64_t nsec = start.tv_nsec + (expirationMillis % 1000) * 1000000; - if (nsec < 1000000000) { - timeout.tv_nsec = nsec; - } else { - timeout.tv_sec += 1; - timeout.tv_nsec = nsec - 1000000000; - } - - pthread_mutex_lock(&lock); - condResult = pthread_cond_timedwait(&cond, &lock, &timeout); - pthread_mutex_unlock(&lock); - - if (condResult != 0) { - if (condResult == ETIMEDOUT) { - LOG(WARNING) << __func__ << " latency for AoC timeout: " << expirationMillis << " ms"; - } else { - LOG(ERROR) << "Failed to wait for the condition variable: " << condResult; - } - ret = false; - } else { - for (const auto &residency : stateResidencies) { - residencies->emplace(residency.first, residency.second); - } - } - return ret; } diff --git a/powerstats/include/AocStateResidencyDataProvider.h b/powerstats/include/AocStateResidencyDataProvider.h index 150f335..5008912 100644 --- a/powerstats/include/AocStateResidencyDataProvider.h +++ b/powerstats/include/AocStateResidencyDataProvider.h @@ -27,8 +27,7 @@ namespace stats { class AocStateResidencyDataProvider : public PowerStats::IStateResidencyDataProvider { public: AocStateResidencyDataProvider(std::vector<std::pair<std::string, std::string>> ids, - std::vector<std::pair<std::string, std::string>> states, - const uint64_t timeoutMillis); + std::vector<std::pair<std::string, std::string>> states); ~AocStateResidencyDataProvider() = default; bool getStateResidencies( std::unordered_map<std::string, std::vector<StateResidency>> *residencies) override; @@ -37,12 +36,10 @@ class AocStateResidencyDataProvider : public PowerStats::IStateResidencyDataProv private: std::unordered_map<std::string /* entity name */, std::vector<std::unique_ptr<GenericStateResidencyDataProvider>> /* providers */> mProviders; - int32_t mStateCount; - uint64_t mTimeoutMillis; }; } // namespace stats } // namespace power } // namespace hardware } // namespace android -} // namespace aidl +} // namespace aidl
\ No newline at end of file |