mediametrics: implement AStatsManager_PullAtomCallback
Bug: 141714243
Test: mediametrics_tests
Change-Id: Ie1fad29f40626bb6d363ba04c1669ba7753d25f0
diff --git a/services/mediametrics/iface_statsd.cpp b/services/mediametrics/iface_statsd.cpp
index 0ce2f4a..b7c5296 100644
--- a/services/mediametrics/iface_statsd.cpp
+++ b/services/mediametrics/iface_statsd.cpp
@@ -27,7 +27,10 @@
#include <pthread.h>
#include <unistd.h>
+#include <map>
#include <memory>
+#include <string>
+#include <vector>
#include <string.h>
#include <pwd.h>
@@ -47,30 +50,13 @@
bool enabled_statsd = true;
-struct statsd_hooks {
- const char *key;
- bool (*handler)(const mediametrics::Item *);
-};
+using statsd_pusher = bool (*)(const mediametrics::Item *);
+using statsd_puller = bool (*)(const mediametrics::Item *, AStatsEventList *);
-// keep this sorted, so we can do binary searches
-static constexpr struct statsd_hooks statsd_handlers[] =
-{
- { "audiopolicy", statsd_audiopolicy },
- { "audiorecord", statsd_audiorecord },
- { "audiothread", statsd_audiothread },
- { "audiotrack", statsd_audiotrack },
- { "codec", statsd_codec},
- { "drmmanager", statsd_drmmanager },
- { "extractor", statsd_extractor },
- { "mediadrm", statsd_mediadrm },
- { "mediaparser", statsd_mediaparser },
- { "nuplayer", statsd_nuplayer },
- { "nuplayer2", statsd_nuplayer },
- { "recorder", statsd_recorder },
-};
-
-// give me a record, i'll look at the type and upload appropriately
-bool dump2Statsd(const std::shared_ptr<const mediametrics::Item>& item) {
+namespace {
+template<typename Handler, typename... Args>
+bool dump2StatsdInternal(const std::map<std::string, Handler>& handlers,
+ const std::shared_ptr<const mediametrics::Item>& item, Args... args) {
if (item == nullptr) return false;
// get the key
@@ -81,12 +67,39 @@
return false;
}
- for (const auto &statsd_handler : statsd_handlers) {
- if (key == statsd_handler.key) {
- return statsd_handler.handler(item.get());
- }
+ if (handlers.count(key)) {
+ return (handlers.at(key))(item.get(), args...);
}
return false;
}
+} // namespace
+
+// give me a record, I'll look at the type and upload appropriately
+bool dump2Statsd(const std::shared_ptr<const mediametrics::Item>& item) {
+ static const std::map<std::string, statsd_pusher> statsd_pushers =
+ {
+ { "audiopolicy", statsd_audiopolicy },
+ { "audiorecord", statsd_audiorecord },
+ { "audiothread", statsd_audiothread },
+ { "audiotrack", statsd_audiotrack },
+ { "codec", statsd_codec},
+ { "drmmanager", statsd_drmmanager },
+ { "extractor", statsd_extractor },
+ { "mediadrm", statsd_mediadrm },
+ { "mediaparser", statsd_mediaparser },
+ { "nuplayer", statsd_nuplayer },
+ { "nuplayer2", statsd_nuplayer },
+ { "recorder", statsd_recorder },
+ };
+ return dump2StatsdInternal(statsd_pushers, item);
+}
+
+bool dump2Statsd(const std::shared_ptr<const mediametrics::Item>& item, AStatsEventList* out) {
+ static const std::map<std::string, statsd_puller> statsd_pullers =
+ {
+ { "mediadrm", statsd_mediadrm_puller },
+ };
+ return dump2StatsdInternal(statsd_pullers, item, out);
+}
} // namespace android