From 8f681ee98c795de4b199bfa64909fa2bc519fcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=99=97?= Date: Thu, 28 Aug 2025 15:34:20 +0800 Subject: [PATCH] multi screen multi user feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 胡晗 --- .../include/session_manager_lite.h | 23 ++++- .../src/session_manager_lite.cpp | 91 +++++++++++++++---- 2 files changed, 94 insertions(+), 20 deletions(-) diff --git a/window_scene/session_manager/include/session_manager_lite.h b/window_scene/session_manager/include/session_manager_lite.h index e298d579bc..f22121b377 100644 --- a/window_scene/session_manager/include/session_manager_lite.h +++ b/window_scene/session_manager/include/session_manager_lite.h @@ -29,17 +29,27 @@ namespace OHOS::Rosen { class SSMDeathRecipientLite : public IRemoteObject::DeathRecipient { public: + SSMDeathRecipientLite(const int32_t userId = INVALID_USER_ID); void OnRemoteDied(const wptr& wptrDeath) override; + +private: + int32_t userId_; }; class FoundationDeathRecipientLite : public IRemoteObject::DeathRecipient { public: + FoundationDeathRecipientLite(const int32_t userId = INVALID_USER_ID); void OnRemoteDied(const wptr& wptrDeath) override; + +private: + int32_t userId_; }; -class SessionManagerLite { +class SessionManagerLite : public RefBase{ WM_DECLARE_SINGLE_INSTANCE_BASE(SessionManagerLite); public: + static sptr GetInstance(const int32_t userId); + void ClearSessionManagerProxy(); void Clear(); @@ -70,8 +80,8 @@ public: void RecoverSessionManagerService(const sptr& sessionManagerService); protected: - SessionManagerLite() = default; - virtual ~SessionManagerLite(); + SessionManagerLite(const int32_t userId = INVALID_USER_ID); + virtual ~SessionManagerLite() override; private: void InitSessionManagerServiceProxy(); @@ -80,12 +90,17 @@ private: void DeleteAllSessionListeners(); void ReregisterSessionListener(); + void RemoveDeathRecipientFromProxy(const sptr& proxy, + const sptr& recipient); WMError InitMockSMSProxy(); /* - * Multi User + * Multi User and multi screen */ + int32_t userId_; + static std::unordered_map> sessionManagerLiteMap_; + static std::mutex sessionManagerLiteMapMutex_; void OnUserSwitch(const sptr& sessionManagerService); void OnWMSConnectionChangedCallback(int32_t userId, int32_t screenId, bool isConnected, bool isCallbackRegistered); diff --git a/window_scene/session_manager/src/session_manager_lite.cpp b/window_scene/session_manager/src/session_manager_lite.cpp index bfa0e313d5..8f41737017 100644 --- a/window_scene/session_manager/src/session_manager_lite.cpp +++ b/window_scene/session_manager/src/session_manager_lite.cpp @@ -27,10 +27,13 @@ namespace OHOS::Rosen { namespace { constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, HILOG_DOMAIN_WINDOW, "SessionManagerLite" }; } +std::unordered_map> SessionManagerLite::sessionManagerLiteMap_ = {}; +std::mutex SessionManagerLite::sessionManagerLiteMapMutex_; class SessionManagerServiceLiteRecoverListener : public IRemoteStub { public: - SessionManagerServiceLiteRecoverListener() = default; + explicit SessionManagerServiceLiteRecoverListener(sptr sml) + : sessionManagerLite_(sml) {} int32_t OnRemoteRequest( uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) override @@ -72,19 +75,32 @@ public: void OnSessionManagerServiceRecover(const sptr& sessionManagerService) override { - SessionManagerLite::GetInstance().Clear(); - SessionManagerLite::GetInstance().ClearSessionManagerProxy(); + if (sessionManagerLite_ == nullptr) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "failed to get sessionManagerLite_"); + return; + } + sessionManagerLite_->clear(); + sessionManagerLite_->ClearSessionManagerProxy(); auto sms = iface_cast(sessionManagerService); - SessionManagerLite::GetInstance().RecoverSessionManagerService(sms); + sessionManagerLite_->RecoverSessionManagerService(sms); } - void OnWMSConnectionChanged( - int32_t userId, int32_t screenId, bool isConnected, const sptr& sessionManagerService) override + void OnWMSConnectionChanged(int32_t userId, + int32_t screenId, + bool isConnected, + const sptr& sessionManagerService) override { + if (sessionManagerLite_ == nullptr) { + TLOGE(WmsLogTag::WMS_MULTI_USER, "failed to get sessionManagerLite_"); + return; + } auto sms = iface_cast(sessionManagerService); - SessionManagerLite::GetInstance().OnWMSConnectionChanged(userId, screenId, isConnected, sms); + sessionManagerLite_->OnWMSConnectionChanged(userId, screenId, isConnected, sms); } + +private: + sptr sessionManagerLite_ = nullptr; }; class SceneSessionManagerLiteProxyMock : public SceneSessionManagerLiteProxy { @@ -114,12 +130,48 @@ public: SessionManagerLite::GetInstance().DeleteSessionListener(listener); return ret; } - + private: static inline BrokerDelegator delegator_; }; -WM_IMPLEMENT_SINGLE_INSTANCE(SessionManagerLite) +SessionManagerLite& SessionManagerLite::GetInstance() +{ + static sptr instance = nullptr; + static std::mutex mtx; + if (instance == nullptr) { + std::lock_guard lock(mtx); + if (instance == nullptr) { + instance = new SessionManagerLite(); + } + } + return *instance; +} + +sptr SessionManagerLite::GetInstance(const int32_t userId) +{ + sptr instance = nullptr; + + if (userId <= INVALID_USER_ID) { + instance = &SessionManagerLite::GetInstance(); + return instance; + } + //multi-instance mode + { + std::lock_guard lock(sessionManagerLiteMapMutex_); + auto iter = sessionManagerLiteMap_.find(userId); + if (iter != sessionManagerLiteMap_.end()) { + return iter.second; + } + } + TLOGI(WmsLogTag::WMS_MULTI_USER, "create new instance userId: %{public}d", userId); + instance = new SessionManagerLite(userId); + std::lock_guard lock(sessionManagerLiteMapMutex_); + sessionManagerLiteMap_.insert({userId, instance}); + return instance; +} + +SessionManagerLite::SessionManagerLite(const int32_t userId) : userId_(userId) {} SessionManagerLite::~SessionManagerLite() { @@ -365,7 +417,7 @@ void SessionManagerLite::InitSceneSessionManagerLiteProxy() } sceneSessionManagerLiteProxy_ = iface_cast(remoteObject); if (sceneSessionManagerLiteProxy_) { - ssmDeath_ = sptr::MakeSptr(); + ssmDeath_ = sptr::MakeSptr(userId_); if (remoteObject->IsProxyObject() && !remoteObject->AddDeathRecipient(ssmDeath_)) { WLOGFE("Failed to add death recipient"); return; @@ -383,11 +435,13 @@ void SessionManagerLite::Clear() } } +SSMDeathRecipientLite::SSMDeathRecipientLite(const int32_t userId) : userId_(userId) {} + void SSMDeathRecipientLite::OnRemoteDied(const wptr& wptrDeath) { - WLOGI("ssm OnRemoteDied"); - SessionManagerLite::GetInstance().Clear(); - SessionManagerLite::GetInstance().ClearSessionManagerProxy(); + TLOGE(WmsLogTag::WMS_SCB, "ssm lite OnRemoteDied"); + SessionManagerLite::GetInstance(userId)->Clear(); + SessionManagerLite::GetInstance(userId)->ClearSessionManagerProxy(); } WMError SessionManagerLite::RegisterWMSConnectionChangedListener(const WMSConnectionChangedCallbackFunc& callbackFunc) @@ -457,7 +511,7 @@ WMError SessionManagerLite::InitMockSMSProxy() return WMError::WM_OK; } if (!foundationDeath_) { - foundationDeath_ = sptr::MakeSptr(); + foundationDeath_ = sptr::MakeSptr(userId_); } if (remoteObject->IsProxyObject() && !remoteObject->AddDeathRecipient(foundationDeath_)) { TLOGE(WmsLogTag::WMS_MULTI_USER, "Failed to add death recipient"); @@ -477,8 +531,10 @@ void SessionManagerLite::RegisterSMSRecoverListener() } recoverListenerRegistered_ = true; TLOGD(WmsLogTag::WMS_RECOVER, "Register recover listener"); - smsRecoverListener_ = sptr::MakeSptr(); + sptr sml(this); + smsRecoverListener_ = sptr::MakeSptr(sml); std::string identity = IPCSkeleton::ResetCallingIdentity(); + TLOGD(WmsLogTag::WMS_RECOVER, "Register recover listener, userId: %{public}d", userId_); mockSessionManagerServiceProxy_->RegisterSMSLiteRecoverListener(smsRecoverListener_); IPCSkeleton::SetCallingIdentity(identity); } @@ -489,6 +545,7 @@ void SessionManagerLite::UnregisterSMSRecoverListener() std::lock_guard lock(mutex_); recoverListenerRegistered_ = false; if (mockSessionManagerServiceProxy_) { + TLOGD(WmsLogTag::WMS_RECOVER, "Unregister recover listener, userId: %{public}d", userId_); mockSessionManagerServiceProxy_->UnregisterSMSLiteRecoverListener(); } } @@ -506,10 +563,12 @@ void SessionManagerLite::OnWMSConnectionChangedCallback( } } +FoundationDeathRecipientLite::FoundationDeathRecipientLite(const int32_t userId) : userId_(userId) {} + void FoundationDeathRecipientLite::OnRemoteDied(const wptr& wptrDeath) { TLOGI(WmsLogTag::WMS_RECOVER, "Foundation died"); - SessionManagerLite::GetInstance().OnFoundationDied(); + SessionManagerLite::GetInstance(userId_)->OnFoundationDied(); } void SessionManagerLite::OnFoundationDied() -- Gitee