From d1d72e829ec6c2577d1f0d5cd0f02af555ac1cda Mon Sep 17 00:00:00 2001 From: yuanjinghua Date: Mon, 24 Jul 2023 10:57:58 +0800 Subject: [PATCH] Add lock for operations of MediaStatStub to prevent condition contention problems Signed-off-by: yuanjinghua --- engine/scene/common/media_stat_stub.cpp | 9 ++++++++- engine/scene/common/media_stat_stub.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/engine/scene/common/media_stat_stub.cpp b/engine/scene/common/media_stat_stub.cpp index d0e6cc95..14294e03 100644 --- a/engine/scene/common/media_stat_stub.cpp +++ b/engine/scene/common/media_stat_stub.cpp @@ -19,16 +19,19 @@ #include #include "foundation/log.h" +#include "foundation/osal/thread/scoped_lock.h" namespace OHOS { namespace Media { void MediaStatStub::Reset() { + OSAL::ScopedLock lock(mediaStatMutex_); mediaStats_.clear(); } void MediaStatStub::Append(const std::string& reporter) { + OSAL::ScopedLock lock(mediaStatMutex_); for (auto& stat : mediaStats_) { if (stat.reporter == reporter) { return; @@ -40,7 +43,8 @@ void MediaStatStub::Append(const std::string& reporter) void MediaStatStub::ReceiveEvent(const Event& event) { switch (event.type) { - case EventType::EVENT_COMPLETE: + case EventType::EVENT_COMPLETE: { + OSAL::ScopedLock lock(mediaStatMutex_); for (auto& stat : mediaStats_) { if (stat.reporter == event.srcFilter) { stat.completeEventReceived = true; @@ -48,6 +52,7 @@ void MediaStatStub::ReceiveEvent(const Event& event) } } break; + } default: MEDIA_LOG_W("MediaStats::ReceiveEvent receive unexpected event " PUBLIC_LOG_D32, static_cast(event.type)); @@ -57,6 +62,7 @@ void MediaStatStub::ReceiveEvent(const Event& event) bool MediaStatStub::IsEventCompleteAllReceived() { + OSAL::ScopedLock lock(mediaStatMutex_); return std::all_of(mediaStats_.begin(), mediaStats_.end(), [](const MediaStat& stat) { return stat.completeEventReceived.load(); }); @@ -64,6 +70,7 @@ bool MediaStatStub::IsEventCompleteAllReceived() void MediaStatStub::ResetEventCompleteAllReceived() { + OSAL::ScopedLock lock(mediaStatMutex_); for (auto& mediaStat : mediaStats_) { mediaStat.completeEventReceived = false; } diff --git a/engine/scene/common/media_stat_stub.h b/engine/scene/common/media_stat_stub.h index be24e960..3880a427 100644 --- a/engine/scene/common/media_stat_stub.h +++ b/engine/scene/common/media_stat_stub.h @@ -20,6 +20,7 @@ #include #include +#include "foundation/osal/thread/mutex.h" #include "pipeline/core/event.h" namespace OHOS { @@ -52,6 +53,7 @@ public: void ResetEventCompleteAllReceived(); private: + OSAL::Mutex mediaStatMutex_ {}; std::vector mediaStats_; }; } // Media -- Gitee