MediaMetrics: Add const correctness for items in service
Allows multithreaded use of items without lock.
Test: mediametrics dumpsys, atest mediametrics_tests
Bug: 138583596
Change-Id: Ieb901076b9acc33a89737b320a4fc8ce82f2608d
diff --git a/services/mediaanalytics/MediaAnalyticsService.cpp b/services/mediaanalytics/MediaAnalyticsService.cpp
index 33a5a90..f1f4761 100644
--- a/services/mediaanalytics/MediaAnalyticsService.cpp
+++ b/services/mediaanalytics/MediaAnalyticsService.cpp
@@ -140,12 +140,12 @@
return BAD_VALUE;
}
- // send to statsd
- extern bool dump2Statsd(MediaAnalyticsItem *item); // extern hook
- (void)dump2Statsd(item); // failure should be logged in function.
+ // now attach either the item or its dup to a const shared pointer
+ std::shared_ptr<const MediaAnalyticsItem> sitem(release ? item : item->dup());
- if (!release) item = item->dup();
- saveItem(item);
+ extern bool dump2Statsd(const std::shared_ptr<const MediaAnalyticsItem>& item);
+ (void)dump2Statsd(sitem); // failure should be logged in function.
+ saveItem(sitem);
return NO_ERROR;
}
@@ -325,7 +325,7 @@
// if item != NULL, it's the item we just inserted
// true == more items eligible to be recovered
-bool MediaAnalyticsService::expirations_l(MediaAnalyticsItem *item)
+bool MediaAnalyticsService::expirations_l(const std::shared_ptr<const MediaAnalyticsItem>& item)
{
bool more = false;
@@ -348,7 +348,7 @@
for (; i < mItems.size(); ++i) {
auto &oitem = mItems[i];
nsecs_t when = oitem->getTimestamp();
- if (oitem.get() == item) {
+ if (oitem.get() == item.get()) {
break;
}
if (now > when && (now - when) <= mMaxRecordAgeNs) {
@@ -384,7 +384,7 @@
} while (more);
}
-void MediaAnalyticsService::saveItem(MediaAnalyticsItem *item)
+void MediaAnalyticsService::saveItem(const std::shared_ptr<const MediaAnalyticsItem>& item)
{
std::lock_guard _l(mLock);
// we assume the items are roughly in time order.
diff --git a/services/mediaanalytics/MediaAnalyticsService.h b/services/mediaanalytics/MediaAnalyticsService.h
index 7ac14da..4a8b971 100644
--- a/services/mediaanalytics/MediaAnalyticsService.h
+++ b/services/mediaanalytics/MediaAnalyticsService.h
@@ -66,10 +66,10 @@
// input validation after arrival from client
static bool isContentValid(const MediaAnalyticsItem *item, bool isTrusted);
bool isRateLimited(MediaAnalyticsItem *) const;
- void saveItem(MediaAnalyticsItem *);
+ void saveItem(const std::shared_ptr<const MediaAnalyticsItem>& item);
// The following methods are GUARDED_BY(mLock)
- bool expirations_l(MediaAnalyticsItem *);
+ bool expirations_l(const std::shared_ptr<const MediaAnalyticsItem>& item);
// support for generating output
void dumpQueue_l(String8 &result, int dumpProto);
diff --git a/services/mediaanalytics/iface_statsd.cpp b/services/mediaanalytics/iface_statsd.cpp
index e02c9cf..dccc76a 100644
--- a/services/mediaanalytics/iface_statsd.cpp
+++ b/services/mediaanalytics/iface_statsd.cpp
@@ -27,6 +27,7 @@
#include <pthread.h>
#include <unistd.h>
+#include <memory>
#include <string.h>
#include <pwd.h>
@@ -48,7 +49,7 @@
struct statsd_hooks {
const char *key;
- bool (*handler)(MediaAnalyticsItem *);
+ bool (*handler)(const MediaAnalyticsItem *);
};
// keep this sorted, so we can do binary searches
@@ -69,7 +70,7 @@
};
// give me a record, i'll look at the type and upload appropriately
-bool dump2Statsd(MediaAnalyticsItem *item) {
+bool dump2Statsd(const std::shared_ptr<const MediaAnalyticsItem>& item) {
if (item == NULL) return false;
// get the key
@@ -82,7 +83,7 @@
for (const auto &statsd_handler : statsd_handlers) {
if (key == statsd_handler.key) {
- return statsd_handler.handler(item);
+ return statsd_handler.handler(item.get());
}
}
return false;
diff --git a/services/mediaanalytics/iface_statsd.h b/services/mediaanalytics/iface_statsd.h
index 014929b..1c48118 100644
--- a/services/mediaanalytics/iface_statsd.h
+++ b/services/mediaanalytics/iface_statsd.h
@@ -19,17 +19,17 @@
extern bool enabled_statsd;
// component specific dumpers
-extern bool statsd_audiopolicy(MediaAnalyticsItem *);
-extern bool statsd_audiorecord(MediaAnalyticsItem *);
-extern bool statsd_audiothread(MediaAnalyticsItem *);
-extern bool statsd_audiotrack(MediaAnalyticsItem *);
-extern bool statsd_codec(MediaAnalyticsItem *);
-extern bool statsd_extractor(MediaAnalyticsItem *);
-extern bool statsd_nuplayer(MediaAnalyticsItem *);
-extern bool statsd_recorder(MediaAnalyticsItem *);
+extern bool statsd_audiopolicy(const MediaAnalyticsItem *);
+extern bool statsd_audiorecord(const MediaAnalyticsItem *);
+extern bool statsd_audiothread(const MediaAnalyticsItem *);
+extern bool statsd_audiotrack(const MediaAnalyticsItem *);
+extern bool statsd_codec(const MediaAnalyticsItem *);
+extern bool statsd_extractor(const MediaAnalyticsItem *);
+extern bool statsd_nuplayer(const MediaAnalyticsItem *);
+extern bool statsd_recorder(const MediaAnalyticsItem *);
-extern bool statsd_mediadrm(MediaAnalyticsItem *);
-extern bool statsd_widevineCDM(MediaAnalyticsItem *);
-extern bool statsd_drmmanager(MediaAnalyticsItem *);
+extern bool statsd_mediadrm(const MediaAnalyticsItem *);
+extern bool statsd_widevineCDM(const MediaAnalyticsItem *);
+extern bool statsd_drmmanager(const MediaAnalyticsItem *);
} // namespace android
diff --git a/services/mediaanalytics/statsd_audiopolicy.cpp b/services/mediaanalytics/statsd_audiopolicy.cpp
index 95cb274..2c11100 100644
--- a/services/mediaanalytics/statsd_audiopolicy.cpp
+++ b/services/mediaanalytics/statsd_audiopolicy.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_audiopolicy(MediaAnalyticsItem *item)
+bool statsd_audiopolicy(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_audiorecord.cpp b/services/mediaanalytics/statsd_audiorecord.cpp
index 7c7a62c..6a80dd0 100644
--- a/services/mediaanalytics/statsd_audiorecord.cpp
+++ b/services/mediaanalytics/statsd_audiorecord.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_audiorecord(MediaAnalyticsItem *item)
+bool statsd_audiorecord(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_audiothread.cpp b/services/mediaanalytics/statsd_audiothread.cpp
index e9d6b17..e62899b 100644
--- a/services/mediaanalytics/statsd_audiothread.cpp
+++ b/services/mediaanalytics/statsd_audiothread.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_audiothread(MediaAnalyticsItem *item)
+bool statsd_audiothread(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_audiotrack.cpp b/services/mediaanalytics/statsd_audiotrack.cpp
index 57cda99..10bf298 100644
--- a/services/mediaanalytics/statsd_audiotrack.cpp
+++ b/services/mediaanalytics/statsd_audiotrack.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_audiotrack(MediaAnalyticsItem *item)
+bool statsd_audiotrack(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_codec.cpp b/services/mediaanalytics/statsd_codec.cpp
index bf82e50..519091f 100644
--- a/services/mediaanalytics/statsd_codec.cpp
+++ b/services/mediaanalytics/statsd_codec.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_codec(MediaAnalyticsItem *item)
+bool statsd_codec(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_drm.cpp b/services/mediaanalytics/statsd_drm.cpp
index 845383d..5c81ebf 100644
--- a/services/mediaanalytics/statsd_drm.cpp
+++ b/services/mediaanalytics/statsd_drm.cpp
@@ -38,7 +38,7 @@
namespace android {
// mediadrm
-bool statsd_mediadrm(MediaAnalyticsItem *item)
+bool statsd_mediadrm(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
@@ -75,7 +75,7 @@
}
// widevineCDM
-bool statsd_widevineCDM(MediaAnalyticsItem *item)
+bool statsd_widevineCDM(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
@@ -105,7 +105,7 @@
}
// drmmanager
-bool statsd_drmmanager(MediaAnalyticsItem *item)
+bool statsd_drmmanager(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_extractor.cpp b/services/mediaanalytics/statsd_extractor.cpp
index d84930c..55d5c29 100644
--- a/services/mediaanalytics/statsd_extractor.cpp
+++ b/services/mediaanalytics/statsd_extractor.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_extractor(MediaAnalyticsItem *item)
+bool statsd_extractor(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_nuplayer.cpp b/services/mediaanalytics/statsd_nuplayer.cpp
index e6e0f2c..791a125 100644
--- a/services/mediaanalytics/statsd_nuplayer.cpp
+++ b/services/mediaanalytics/statsd_nuplayer.cpp
@@ -41,7 +41,7 @@
* handles nuplayer AND nuplayer2
* checks for the union of what the two players generate
*/
-bool statsd_nuplayer(MediaAnalyticsItem *item)
+bool statsd_nuplayer(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;
diff --git a/services/mediaanalytics/statsd_recorder.cpp b/services/mediaanalytics/statsd_recorder.cpp
index d286f00..e6383e6 100644
--- a/services/mediaanalytics/statsd_recorder.cpp
+++ b/services/mediaanalytics/statsd_recorder.cpp
@@ -37,7 +37,7 @@
namespace android {
-bool statsd_recorder(MediaAnalyticsItem *item)
+bool statsd_recorder(const MediaAnalyticsItem *item)
{
if (item == NULL) return false;