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;