Loading media/libmediametrics/Android.bp +4 −2 Original line number Diff line number Diff line Loading @@ -22,9 +22,11 @@ cc_library_shared { export_include_dirs: ["include"], cflags: [ "-Werror", "-Wno-error=deprecated-declarations", "-Wall", "-Werror", "-Wextra", "-Wthread-safety", "-Wunreachable-code", ], sanitize: { Loading services/mediametrics/AnalyticsActions.h +2 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include <android-base/thread_annotations.h> #include <media/MediaMetricsItem.h> #include <mutex> Loading Loading @@ -144,7 +145,7 @@ private: } mutable std::mutex mLock; std::map<Trigger, Action> mFilters; // GUARDED_BY mLock std::map<Trigger, Action> mFilters GUARDED_BY(mLock); }; } // namespace android::mediametrics services/mediametrics/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ cc_binary { "-Wall", "-Werror", "-Wextra", "-Wthread-safety", ], } Loading services/mediametrics/MediaMetricsService.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -282,8 +282,8 @@ status_t MediaMetricsService::dump(int fd, const Vector<String16>& args) } else { result.appendFormat("Dump of the %s process:\n", kServiceName); const char *prefixptr = prefix.size() > 0 ? prefix.c_str() : nullptr; dumpHeaders_l(result, sinceNs, prefixptr); dumpQueue_l(result, sinceNs, prefixptr); dumpHeaders(result, sinceNs, prefixptr); dumpQueue(result, sinceNs, prefixptr); // TODO: maybe consider a better way of dumping audio analytics info. const int32_t linesToDump = all ? INT32_MAX : 1000; Loading Loading @@ -312,7 +312,7 @@ status_t MediaMetricsService::dump(int fd, const Vector<String16>& args) } // dump headers void MediaMetricsService::dumpHeaders_l(String8 &result, int64_t sinceNs, const char* prefix) void MediaMetricsService::dumpHeaders(String8 &result, int64_t sinceNs, const char* prefix) { if (mediametrics::Item::isEnabled()) { result.append("Metrics gathering: enabled\n"); Loading @@ -337,7 +337,7 @@ void MediaMetricsService::dumpHeaders_l(String8 &result, int64_t sinceNs, const } // TODO: should prefix be a set<string>? void MediaMetricsService::dumpQueue_l(String8 &result, int64_t sinceNs, const char* prefix) void MediaMetricsService::dumpQueue(String8 &result, int64_t sinceNs, const char* prefix) { if (mItems.empty()) { result.append("empty\n"); Loading @@ -364,7 +364,7 @@ void MediaMetricsService::dumpQueue_l(String8 &result, int64_t sinceNs, const ch // if item != NULL, it's the item we just inserted // true == more items eligible to be recovered bool MediaMetricsService::expirations_l(const std::shared_ptr<const mediametrics::Item>& item) bool MediaMetricsService::expirations(const std::shared_ptr<const mediametrics::Item>& item) { bool more = false; Loading Loading @@ -419,7 +419,7 @@ void MediaMetricsService::processExpirations() do { sleep(1); std::lock_guard _l(mLock); more = expirations_l(nullptr); more = expirations(nullptr); } while (more); } Loading @@ -429,7 +429,7 @@ void MediaMetricsService::saveItem(const std::shared_ptr<const mediametrics::Ite // we assume the items are roughly in time order. mItems.emplace_back(item); ++mItemsFinalized; if (expirations_l(item) if (expirations(item) && (!mExpireFuture.valid() || mExpireFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)) { mExpireFuture = std::async(std::launch::async, [this] { processExpirations(); }); Loading services/mediametrics/MediaMetricsService.h +11 −11 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <unordered_map> // IMediaMetricsService must include Vector, String16, Errors #include <android-base/thread_annotations.h> #include <media/IMediaMetricsService.h> #include <mediautils/ServiceUtilities.h> #include <utils/String8.h> Loading Loading @@ -81,12 +82,11 @@ private: bool isRateLimited(mediametrics::Item *) const; void saveItem(const std::shared_ptr<const mediametrics::Item>& item); // The following methods are GUARDED_BY(mLock) bool expirations_l(const std::shared_ptr<const mediametrics::Item>& item); bool expirations(const std::shared_ptr<const mediametrics::Item>& item) REQUIRES(mLock); // support for generating output void dumpQueue_l(String8 &result, int64_t sinceNs, const char* prefix); void dumpHeaders_l(String8 &result, int64_t sinceNs, const char* prefix); void dumpQueue(String8 &result, int64_t sinceNs, const char* prefix) REQUIRES(mLock); void dumpHeaders(String8 &result, int64_t sinceNs, const char* prefix) REQUIRES(mLock); // The following variables accessed without mLock Loading @@ -102,22 +102,22 @@ private: mediautils::UidInfo mUidInfo; // mUidInfo can be accessed without lock (locked internally) mediametrics::AudioAnalytics mAudioAnalytics; mediametrics::AudioAnalytics mAudioAnalytics; // mAudioAnalytics is locked internally. std::mutex mLock; // statistics about our analytics int64_t mItemsFinalized = 0; // GUARDED_BY(mLock) int64_t mItemsDiscarded = 0; // GUARDED_BY(mLock) int64_t mItemsDiscardedExpire = 0; // GUARDED_BY(mLock) int64_t mItemsDiscardedCount = 0; // GUARDED_BY(mLock) int64_t mItemsFinalized GUARDED_BY(mLock) = 0; int64_t mItemsDiscarded GUARDED_BY(mLock) = 0; int64_t mItemsDiscardedExpire GUARDED_BY(mLock) = 0; int64_t mItemsDiscardedCount GUARDED_BY(mLock) = 0; // If we have a worker thread to garbage collect std::future<void> mExpireFuture; // GUARDED_BY(mLock) std::future<void> mExpireFuture GUARDED_BY(mLock); // Our item queue, generally (oldest at front) // 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) std::deque<std::shared_ptr<const mediametrics::Item>> mItems GUARDED_BY(mLock); }; } // namespace android Loading
media/libmediametrics/Android.bp +4 −2 Original line number Diff line number Diff line Loading @@ -22,9 +22,11 @@ cc_library_shared { export_include_dirs: ["include"], cflags: [ "-Werror", "-Wno-error=deprecated-declarations", "-Wall", "-Werror", "-Wextra", "-Wthread-safety", "-Wunreachable-code", ], sanitize: { Loading
services/mediametrics/AnalyticsActions.h +2 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ #pragma once #include <android-base/thread_annotations.h> #include <media/MediaMetricsItem.h> #include <mutex> Loading Loading @@ -144,7 +145,7 @@ private: } mutable std::mutex mLock; std::map<Trigger, Action> mFilters; // GUARDED_BY mLock std::map<Trigger, Action> mFilters GUARDED_BY(mLock); }; } // namespace android::mediametrics
services/mediametrics/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ cc_binary { "-Wall", "-Werror", "-Wextra", "-Wthread-safety", ], } Loading
services/mediametrics/MediaMetricsService.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -282,8 +282,8 @@ status_t MediaMetricsService::dump(int fd, const Vector<String16>& args) } else { result.appendFormat("Dump of the %s process:\n", kServiceName); const char *prefixptr = prefix.size() > 0 ? prefix.c_str() : nullptr; dumpHeaders_l(result, sinceNs, prefixptr); dumpQueue_l(result, sinceNs, prefixptr); dumpHeaders(result, sinceNs, prefixptr); dumpQueue(result, sinceNs, prefixptr); // TODO: maybe consider a better way of dumping audio analytics info. const int32_t linesToDump = all ? INT32_MAX : 1000; Loading Loading @@ -312,7 +312,7 @@ status_t MediaMetricsService::dump(int fd, const Vector<String16>& args) } // dump headers void MediaMetricsService::dumpHeaders_l(String8 &result, int64_t sinceNs, const char* prefix) void MediaMetricsService::dumpHeaders(String8 &result, int64_t sinceNs, const char* prefix) { if (mediametrics::Item::isEnabled()) { result.append("Metrics gathering: enabled\n"); Loading @@ -337,7 +337,7 @@ void MediaMetricsService::dumpHeaders_l(String8 &result, int64_t sinceNs, const } // TODO: should prefix be a set<string>? void MediaMetricsService::dumpQueue_l(String8 &result, int64_t sinceNs, const char* prefix) void MediaMetricsService::dumpQueue(String8 &result, int64_t sinceNs, const char* prefix) { if (mItems.empty()) { result.append("empty\n"); Loading @@ -364,7 +364,7 @@ void MediaMetricsService::dumpQueue_l(String8 &result, int64_t sinceNs, const ch // if item != NULL, it's the item we just inserted // true == more items eligible to be recovered bool MediaMetricsService::expirations_l(const std::shared_ptr<const mediametrics::Item>& item) bool MediaMetricsService::expirations(const std::shared_ptr<const mediametrics::Item>& item) { bool more = false; Loading Loading @@ -419,7 +419,7 @@ void MediaMetricsService::processExpirations() do { sleep(1); std::lock_guard _l(mLock); more = expirations_l(nullptr); more = expirations(nullptr); } while (more); } Loading @@ -429,7 +429,7 @@ void MediaMetricsService::saveItem(const std::shared_ptr<const mediametrics::Ite // we assume the items are roughly in time order. mItems.emplace_back(item); ++mItemsFinalized; if (expirations_l(item) if (expirations(item) && (!mExpireFuture.valid() || mExpireFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready)) { mExpireFuture = std::async(std::launch::async, [this] { processExpirations(); }); Loading
services/mediametrics/MediaMetricsService.h +11 −11 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <unordered_map> // IMediaMetricsService must include Vector, String16, Errors #include <android-base/thread_annotations.h> #include <media/IMediaMetricsService.h> #include <mediautils/ServiceUtilities.h> #include <utils/String8.h> Loading Loading @@ -81,12 +82,11 @@ private: bool isRateLimited(mediametrics::Item *) const; void saveItem(const std::shared_ptr<const mediametrics::Item>& item); // The following methods are GUARDED_BY(mLock) bool expirations_l(const std::shared_ptr<const mediametrics::Item>& item); bool expirations(const std::shared_ptr<const mediametrics::Item>& item) REQUIRES(mLock); // support for generating output void dumpQueue_l(String8 &result, int64_t sinceNs, const char* prefix); void dumpHeaders_l(String8 &result, int64_t sinceNs, const char* prefix); void dumpQueue(String8 &result, int64_t sinceNs, const char* prefix) REQUIRES(mLock); void dumpHeaders(String8 &result, int64_t sinceNs, const char* prefix) REQUIRES(mLock); // The following variables accessed without mLock Loading @@ -102,22 +102,22 @@ private: mediautils::UidInfo mUidInfo; // mUidInfo can be accessed without lock (locked internally) mediametrics::AudioAnalytics mAudioAnalytics; mediametrics::AudioAnalytics mAudioAnalytics; // mAudioAnalytics is locked internally. std::mutex mLock; // statistics about our analytics int64_t mItemsFinalized = 0; // GUARDED_BY(mLock) int64_t mItemsDiscarded = 0; // GUARDED_BY(mLock) int64_t mItemsDiscardedExpire = 0; // GUARDED_BY(mLock) int64_t mItemsDiscardedCount = 0; // GUARDED_BY(mLock) int64_t mItemsFinalized GUARDED_BY(mLock) = 0; int64_t mItemsDiscarded GUARDED_BY(mLock) = 0; int64_t mItemsDiscardedExpire GUARDED_BY(mLock) = 0; int64_t mItemsDiscardedCount GUARDED_BY(mLock) = 0; // If we have a worker thread to garbage collect std::future<void> mExpireFuture; // GUARDED_BY(mLock) std::future<void> mExpireFuture GUARDED_BY(mLock); // Our item queue, generally (oldest at front) // 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) std::deque<std::shared_ptr<const mediametrics::Item>> mItems GUARDED_BY(mLock); }; } // namespace android