Switch to using shared_ptr for Session Metrics
[ Merge from http://go/wvgerrit/71443 ] The assumption that the metrics will always outlive the CdmSession instance appears not to always hold (at least in a non-android multi-threaded solution). The shared_ptr ensures that the metrics are available even in these rare race conditions. BUG: http://b/123321465 Test: CDM unit tests. Also http://go/wvgerrit/71264 parallel tests. Change-Id: Iaa6a8f6c0fdc46a911789759d6e1228d849aa237
This commit is contained in:
@@ -353,9 +353,13 @@ class EngineMetrics {
|
||||
~EngineMetrics();
|
||||
|
||||
// Add a new SessionMetrics instance and return a pointer to the caller.
|
||||
// The new SessionMetrics instance is owned by this EngineMetrics instance
|
||||
// and will exist until RemoveSession is called or this object is deleted.
|
||||
SessionMetrics *AddSession();
|
||||
// A shared_ptr is used since it's possible that the SessionMetrics instance
|
||||
// may be in use after the EngineMetrics instance is closed. The EngineMetrics
|
||||
// instance will hold a shared_ptr reference to the SessionMetrics instance
|
||||
// until RemoveSession is called, the EngineMetrics instance is deleted, or
|
||||
// the SessionMetrics instance is marked as completed and ConsolidateSessions
|
||||
// removes it.
|
||||
std::shared_ptr<SessionMetrics> AddSession();
|
||||
|
||||
// Removes the metrics object for the given session id. This should only
|
||||
// be called when the SessionMetrics instance is no longer in use.
|
||||
|
||||
@@ -7,13 +7,14 @@ namespace wvcdm {
|
||||
namespace metrics {
|
||||
|
||||
class TimerMetric {
|
||||
|
||||
public:
|
||||
// Constructs a new TimerMetric.
|
||||
explicit TimerMetric() : is_started_(false) {}
|
||||
// Starts the clock running. If the clock was previously set, this resets it.
|
||||
// IsStarted will return true after this call.
|
||||
void Start();
|
||||
// Returns whether or not the timer has started.
|
||||
bool IsStarted() const { return is_started_; };
|
||||
bool IsStarted() const { return is_started_; }
|
||||
// Stops the clock and clears the current value. IsStarted will return false
|
||||
// after this call.
|
||||
void Clear();
|
||||
@@ -26,7 +27,6 @@ class TimerMetric {
|
||||
std::chrono::steady_clock clock_;
|
||||
std::chrono::time_point<std::chrono::steady_clock> start_;
|
||||
bool is_started_;
|
||||
|
||||
};
|
||||
|
||||
} // namespace metrics
|
||||
|
||||
@@ -154,7 +154,7 @@ void CryptoMetrics::Serialize(WvCdmMetrics::CryptoMetrics *crypto_metrics)
|
||||
crypto_metrics->mutable_oemcrypto_update_usage_entry());
|
||||
}
|
||||
|
||||
SessionMetrics::SessionMetrics() {}
|
||||
SessionMetrics::SessionMetrics() : session_id_(""), completed_(false) {}
|
||||
|
||||
void SessionMetrics::Serialize(WvCdmMetrics::SessionMetrics *session_metrics)
|
||||
const {
|
||||
@@ -268,10 +268,10 @@ EngineMetrics::~EngineMetrics() {
|
||||
}
|
||||
}
|
||||
|
||||
SessionMetrics *EngineMetrics::AddSession() {
|
||||
std::shared_ptr<SessionMetrics> EngineMetrics::AddSession() {
|
||||
std::unique_lock<std::mutex> lock(session_metrics_lock_);
|
||||
active_session_metrics_list_.push_back(std::make_shared<SessionMetrics>());
|
||||
return active_session_metrics_list_.back().get();
|
||||
return active_session_metrics_list_.back();
|
||||
}
|
||||
|
||||
void EngineMetrics::RemoveSession(wvcdm::CdmSessionId session_id) {
|
||||
|
||||
@@ -156,9 +156,11 @@ TEST_F(EngineMetricsTest, EngineMetricsWithSessions) {
|
||||
->crypto_session_load_certificate_private_key_.Record(2.0, NO_ERROR);
|
||||
|
||||
// Create two sessions and record some metrics.
|
||||
SessionMetrics* session_metrics_1 = engine_metrics.AddSession();
|
||||
std::shared_ptr<SessionMetrics> session_metrics_1 =
|
||||
engine_metrics.AddSession();
|
||||
session_metrics_1->SetSessionId(kSessionId1);
|
||||
SessionMetrics* session_metrics_2 = engine_metrics.AddSession();
|
||||
std::shared_ptr<SessionMetrics> session_metrics_2 =
|
||||
engine_metrics.AddSession();
|
||||
session_metrics_2->SetSessionId(kSessionId2);
|
||||
// Record a CryptoMetrics metric in the session.
|
||||
session_metrics_2->GetCryptoMetrics()->crypto_session_generic_decrypt_
|
||||
@@ -184,7 +186,7 @@ TEST_F(EngineMetricsTest, EngineMetricsConsolidateSessions) {
|
||||
EngineMetrics engine_metrics;
|
||||
|
||||
// Create one more session than the max allowed closed sessions.
|
||||
std::vector<SessionMetrics*> session_metrics;
|
||||
std::vector<std::shared_ptr<SessionMetrics>> session_metrics;
|
||||
for (int i = 0; i < kMaxCompletedSessions + 1; i++) {
|
||||
session_metrics.push_back(engine_metrics.AddSession());
|
||||
session_metrics.back()->SetSessionId(std::to_string(i));
|
||||
@@ -208,7 +210,7 @@ TEST_F(EngineMetricsTest, EngineMetricsConsolidateSessionsNoClosedSessions) {
|
||||
EngineMetrics engine_metrics;
|
||||
|
||||
// Create one more session than the max allowed closed sessions.
|
||||
std::vector<SessionMetrics*> session_metrics;
|
||||
std::vector<std::shared_ptr<SessionMetrics>> session_metrics;
|
||||
for (int i = 0; i < kMaxCompletedSessions + 1; i++) {
|
||||
session_metrics.push_back(engine_metrics.AddSession());
|
||||
session_metrics.back()->SetSessionId(std::to_string(i));
|
||||
|
||||
Reference in New Issue
Block a user