Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 718f96b3 authored by Andy Hung's avatar Andy Hung Committed by Android (Google) Code Review
Browse files

Merge "MediaMetrics: Add thread-safety checking" into rvc-dev

parents e202fc24 f7c14104
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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: {
+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#pragma once

#include <android-base/thread_annotations.h>
#include <media/MediaMetricsItem.h>
#include <mutex>

@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ cc_binary {
        "-Wall",
        "-Werror",
        "-Wextra",
        "-Wthread-safety",
    ],
}

+7 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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");
@@ -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");
@@ -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;

@@ -419,7 +419,7 @@ void MediaMetricsService::processExpirations()
    do {
        sleep(1);
        std::lock_guard _l(mLock);
        more = expirations_l(nullptr);
        more = expirations(nullptr);
    } while (more);
}

@@ -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(); });
+11 −11
Original line number Diff line number Diff line
@@ -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>
@@ -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

@@ -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