mediametrics: implement AStatsManager_PullAtomCallback
Bug: 141714243
Test: mediametrics_tests
Change-Id: Ie1fad29f40626bb6d363ba04c1669ba7753d25f0
diff --git a/services/mediametrics/MediaMetricsService.h b/services/mediametrics/MediaMetricsService.h
index bcae397..8bc8019 100644
--- a/services/mediametrics/MediaMetricsService.h
+++ b/services/mediametrics/MediaMetricsService.h
@@ -26,6 +26,7 @@
#include <android-base/thread_annotations.h>
#include <android/media/BnMediaMetricsService.h>
#include <mediautils/ServiceUtilities.h>
+#include <stats_pull_atom_callback.h>
#include <utils/String8.h>
#include "AudioAnalytics.h"
@@ -102,6 +103,15 @@
void dumpQueue(String8 &result, int64_t sinceNs, const char* prefix) REQUIRES(mLock);
void dumpHeaders(String8 &result, int64_t sinceNs, const char* prefix) REQUIRES(mLock);
+ // support statsd pushed atoms
+ static bool isPullable(const std::string &key);
+ static std::string atomTagToKey(int32_t atomTag);
+ static AStatsManager_PullAtomCallbackReturn pullAtomCallback(
+ int32_t atomTag, AStatsEventList* data, void* cookie);
+ AStatsManager_PullAtomCallbackReturn pullItems(int32_t atomTag, AStatsEventList* data);
+ void registerStatsdCallbacksIfNeeded();
+ std::atomic_flag mStatsdRegistered = ATOMIC_FLAG_INIT;
+
// The following variables accessed without mLock
// limit how many records we'll retain
@@ -130,6 +140,12 @@
// TODO: Make separate class, use segmented queue, write lock only end.
// Note: Another analytics module might have ownership of an item longer than the log.
std::deque<std::shared_ptr<const mediametrics::Item>> mItems GUARDED_BY(mLock);
+
+ // Queues per item key, pending to be pulled by statsd.
+ // Use weak_ptr such that a pullable item can still expire.
+ using ItemKey = std::string;
+ using WeakItemQueue = std::deque<std::weak_ptr<const mediametrics::Item>>;
+ std::unordered_map<ItemKey, WeakItemQueue> mPullableItems GUARDED_BY(mLock);
};
} // namespace android