diff options
author | 2020-03-17 17:51:27 -0700 | |
---|---|---|
committer | 2020-03-17 17:51:27 -0700 | |
commit | 822b10aedfa435a7252bd73074708694fd20eb4c (patch) | |
tree | 4c5784f8718409732db726d8809d851cbbe4e525 | |
parent | 8929001832590afd537f2e06147c039b951d862c (diff) |
[GpuStats] Lazily-register statsd callbacks
Previously statsd callbacks were registered when GpuStats was
instantiated. But, statsd is enforcing permissions to verify that the
calling process had permission to register callbacks. The permission
enforcement is happening too early so the callback registration silently
fails. As a workaround, perform callback registration the first time
GpuStats is asked to track stats instead.
Bug: 151682677
Test: builds, boots
Test: adb logcat | grep REGISTER_STATS
Test: adb shell cmd stats pull-source 10054
Test: adb shell cmd stats pull-source 10055
Change-Id: I2d4a4e320825ee5cb393a6560baa8756779b729f
-rw-r--r-- | services/gpuservice/gpustats/GpuStats.cpp | 25 | ||||
-rw-r--r-- | services/gpuservice/gpustats/include/gpustats/GpuStats.h | 5 |
2 files changed, 20 insertions, 10 deletions
diff --git a/services/gpuservice/gpustats/GpuStats.cpp b/services/gpuservice/gpustats/GpuStats.cpp index d0945326b3..263bf61c12 100644 --- a/services/gpuservice/gpustats/GpuStats.cpp +++ b/services/gpuservice/gpustats/GpuStats.cpp @@ -30,16 +30,11 @@ namespace android { -GpuStats::GpuStats() { - AStatsManager_registerPullAtomCallback(android::util::GPU_STATS_GLOBAL_INFO, - GpuStats::pullAtomCallback, nullptr, this); - AStatsManager_registerPullAtomCallback(android::util::GPU_STATS_APP_INFO, - GpuStats::pullAtomCallback, nullptr, this); -} - GpuStats::~GpuStats() { - AStatsManager_unregisterPullAtomCallback(android::util::GPU_STATS_GLOBAL_INFO); - AStatsManager_unregisterPullAtomCallback(android::util::GPU_STATS_APP_INFO); + if (mStatsdRegistered) { + AStatsManager_unregisterPullAtomCallback(android::util::GPU_STATS_GLOBAL_INFO); + AStatsManager_unregisterPullAtomCallback(android::util::GPU_STATS_APP_INFO); + } } static void addLoadingCount(GpuStatsInfo::Driver driver, bool isDriverLoaded, @@ -97,6 +92,7 @@ void GpuStats::insertDriverStats(const std::string& driverPackageName, ATRACE_CALL(); std::lock_guard<std::mutex> lock(mLock); + registerStatsdCallbacksIfNeeded(); ALOGV("Received:\n" "\tdriverPackageName[%s]\n" "\tdriverVersionName[%s]\n" @@ -150,6 +146,7 @@ void GpuStats::insertTargetStats(const std::string& appPackageName, const std::string appStatsKey = appPackageName + std::to_string(driverVersionCode); std::lock_guard<std::mutex> lock(mLock); + registerStatsdCallbacksIfNeeded(); if (!mAppStats.count(appStatsKey)) { return; } @@ -179,6 +176,16 @@ void GpuStats::interceptSystemDriverStatsLocked() { mGlobalStats[0].glesVersion = property_get_int32("ro.opengles.version", 0); } +void GpuStats::registerStatsdCallbacksIfNeeded() { + if (!mStatsdRegistered) { + AStatsManager_registerPullAtomCallback(android::util::GPU_STATS_GLOBAL_INFO, + GpuStats::pullAtomCallback, nullptr, this); + AStatsManager_registerPullAtomCallback(android::util::GPU_STATS_APP_INFO, + GpuStats::pullAtomCallback, nullptr, this); + mStatsdRegistered = true; + } +} + void GpuStats::dump(const Vector<String16>& args, std::string* result) { ATRACE_CALL(); diff --git a/services/gpuservice/gpustats/include/gpustats/GpuStats.h b/services/gpuservice/gpustats/include/gpustats/GpuStats.h index 8ca4e4ed71..55f0da1bc5 100644 --- a/services/gpuservice/gpustats/include/gpustats/GpuStats.h +++ b/services/gpuservice/gpustats/include/gpustats/GpuStats.h @@ -30,7 +30,6 @@ namespace android { class GpuStats { public: - GpuStats(); ~GpuStats(); // Insert new gpu driver stats into global stats and app stats. @@ -66,12 +65,16 @@ private: void dumpAppLocked(std::string* result); // Append cpuVulkanVersion and glesVersion to system driver stats void interceptSystemDriverStatsLocked(); + // Registers statsd callbacks if they have not already been registered + void registerStatsdCallbacksIfNeeded(); // Below limits the memory usage of GpuStats to be less than 10KB. This is // the preferred number for statsd while maintaining nice data quality. static const size_t MAX_NUM_APP_RECORDS = 100; // GpuStats access should be guarded by mLock. std::mutex mLock; + // True if statsd callbacks have been registered. + bool mStatsdRegistered = false; // Key is driver version code. std::unordered_map<uint64_t, GpuStatsGlobalInfo> mGlobalStats; // Key is <app package name>+<driver version code>. |