From 4029942d3668d9a4d1654f306bc6b0ff591b8813 Mon Sep 17 00:00:00 2001 From: huatong Date: Thu, 11 Apr 2024 17:42:37 +0800 Subject: [PATCH] use shared_lock to protect read Signed-off-by: huatong --- window_scene/session/host/include/session.h | 2 +- window_scene/session/host/src/session.cpp | 34 ++++++++------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/window_scene/session/host/include/session.h b/window_scene/session/host/include/session.h index 9ea00cc866..0fce469095 100644 --- a/window_scene/session/host/include/session.h +++ b/window_scene/session/host/include/session.h @@ -487,7 +487,7 @@ protected: float scaleY_ = 1.0f; float pivotX_ = 0.0f; float pivotY_ = 0.0f; - mutable std::mutex dialogVecMutex_; + mutable std::shared_mutex dialogVecMutex_; std::vector> dialogVec_; sptr parentSession_; sptr windowEventChannel_; diff --git a/window_scene/session/host/src/session.cpp b/window_scene/session/host/src/session.cpp index f90d5e59f6..d50e711788 100644 --- a/window_scene/session/host/src/session.cpp +++ b/window_scene/session/host/src/session.cpp @@ -870,11 +870,7 @@ void Session::HandleDialogBackground() return; } - std::vector> dialogVec; - { - std::unique_lock lock(dialogVecMutex_); - dialogVec = dialogVec_; - } + auto dialogVec = GetDialogVector(); for (const auto& dialog : dialogVec) { if (dialog == nullptr) { continue; @@ -899,11 +895,7 @@ void Session::HandleDialogForeground() return; } - std::vector> dialogVec; - { - std::unique_lock lock(dialogVecMutex_); - dialogVec = dialogVec_; - } + auto dialogVec = GetDialogVector(); for (const auto& dialog : dialogVec) { if (dialog == nullptr) { continue; @@ -1343,7 +1335,7 @@ sptr Session::GetParentSession() const void Session::BindDialogToParentSession(const sptr& session) { - std::unique_lock lock(dialogVecMutex_); + std::unique_lock lock(dialogVecMutex_); auto iter = std::find(dialogVec_.begin(), dialogVec_.end(), session); if (iter != dialogVec_.end()) { TLOGW(WmsLogTag::WMS_DIALOG, "Dialog is existed in parentVec, id: %{public}d, parentId: %{public}d", @@ -1357,7 +1349,7 @@ void Session::BindDialogToParentSession(const sptr& session) void Session::RemoveDialogToParentSession(const sptr& session) { - std::unique_lock lock(dialogVecMutex_); + std::unique_lock lock(dialogVecMutex_); auto iter = std::find(dialogVec_.begin(), dialogVec_.end(), session); if (iter != dialogVec_.end()) { TLOGD(WmsLogTag::WMS_DIALOG, "Remove dialog success, id: %{public}d, parentId: %{public}d", @@ -1370,13 +1362,13 @@ void Session::RemoveDialogToParentSession(const sptr& session) std::vector> Session::GetDialogVector() const { - std::unique_lock lock(dialogVecMutex_); + std::shared_lock lock(dialogVecMutex_); return dialogVec_; } void Session::ClearDialogVector() { - std::unique_lock lock(dialogVecMutex_); + std::unique_lock lock(dialogVecMutex_); dialogVec_.clear(); TLOGD(WmsLogTag::WMS_DIALOG, "parentId: %{public}d", GetPersistentId()); return; @@ -1384,12 +1376,12 @@ void Session::ClearDialogVector() bool Session::CheckDialogOnForeground() { - std::unique_lock lock(dialogVecMutex_); - if (dialogVec_.empty()) { + auto dialogVec = GetDialogVector(); + if (dialogVec.empty()) { TLOGD(WmsLogTag::WMS_DIALOG, "Dialog is empty, id: %{public}d", GetPersistentId()); return false; } - for (auto iter = dialogVec_.rbegin(); iter != dialogVec_.rend(); iter++) { + for (auto iter = dialogVec.rbegin(); iter != dialogVec.rend(); iter++) { auto dialogSession = *iter; if (dialogSession && (dialogSession->GetSessionState() == SessionState::STATE_ACTIVE || dialogSession->GetSessionState() == SessionState::STATE_FOREGROUND)) { @@ -1413,11 +1405,10 @@ bool Session::IsTopDialog() const TLOGW(WmsLogTag::WMS_DIALOG, "Dialog's Parent is NULL. id: %{public}d", currentPersistentId); return false; } - std::unique_lock lock(parentSession->dialogVecMutex_); - if (parentSession->dialogVec_.size() <= 1) { + auto parentDialogVec = parentSession->GetDialogVector(); + if (parentDialogVec.size() <= 1) { return true; } - auto parentDialogVec = parentSession->dialogVec_; for (auto iter = parentDialogVec.rbegin(); iter != parentDialogVec.rend(); iter++) { auto dialogSession = *iter; if (dialogSession && (dialogSession->GetSessionState() == SessionState::STATE_ACTIVE || @@ -1469,7 +1460,8 @@ void Session::PresentFocusIfPointDown() void Session::HandlePointDownDialog() { - for (auto dialog : dialogVec_) { + auto dialogVec = GetDialogVector(); + for (auto dialog : dialogVec) { if (dialog && (dialog->GetSessionState() == SessionState::STATE_FOREGROUND || dialog->GetSessionState() == SessionState::STATE_ACTIVE)) { dialog->RaiseToAppTopForPointDown(); -- Gitee