diff --git a/window_scene/screen_session_manager/src/screen_session_manager.cpp b/window_scene/screen_session_manager/src/screen_session_manager.cpp index 7bfa8bdbe7a50debda335fca622f572641e4fd03..3ee1731b67eefa5eaa74f023e709c6d0af200df8 100644 --- a/window_scene/screen_session_manager/src/screen_session_manager.cpp +++ b/window_scene/screen_session_manager/src/screen_session_manager.cpp @@ -8276,15 +8276,15 @@ void ScreenSessionManager::NotifyClientProxyUpdateFoldDisplayMode(FoldDisplayMod void ScreenSessionManager::ScbClientDeathCallback(int32_t deathScbPid) { std::unique_lock lock(oldScbPidsMutex_); - if (deathScbPid == currentScbPId_ || currentScbPId_ == INVALID_SCB_PID) { - SetClientProxy(nullptr); - TLOGE(WmsLogTag::DMS, "death callback and set clientProxy null"); - } if (scbSwitchCV_.wait_for(lock, std::chrono::milliseconds(CV_WAIT_SCBSWITCH_MS)) == std::cv_status::timeout) { TLOGE(WmsLogTag::DMS, "set client task deathScbPid:%{public}d, timeout: %{public}d", deathScbPid, CV_WAIT_SCBSWITCH_MS); } + if (deathScbPid == currentScbPId_ || currentScbPId_ == INVALID_SCB_PID) { + SetClientProxy(nullptr); + TLOGE(WmsLogTag::DMS, "death callback and set clientProxy null"); + } std::ostringstream oss; oss << "Scb client death: " << deathScbPid; TLOGI(WmsLogTag::DMS, "%{public}s", oss.str().c_str()); @@ -8316,6 +8316,7 @@ void ScreenSessionManager::SwitchUser() return; } auto userId = GetUserIdByCallingUid(); + auto newScbPid = IPCSkeleton::GetCallingPid(); currentUserIdForSettings_ = userId; if (g_isPcDevice && userSwitching_) { std::unique_lock lock(switchUserMutex_); @@ -8324,10 +8325,7 @@ void ScreenSessionManager::SwitchUser() userSwitching_ = false; } } - { - std::lock_guard lock(oldScbPidsMutex_); - SwitchScbNodeHandle(userId, IPCSkeleton::GetCallingPid(), false); - } + SwitchScbNodeHandle(userId, newScbPid, false); MockSessionManagerService::GetInstance().NotifyWMSConnected(userId, GetDefaultScreenId(), false); #endif } @@ -8581,23 +8579,21 @@ void ScreenSessionManager::SetClient(const sptr& cl userSwitching_ = false; } } - { - std::unique_lock lock(oldScbPidsMutex_); - SetClientProxy(client); - auto userId = GetUserIdByCallingUid(); - auto newScbPid = IPCSkeleton::GetCallingPid(); + SetClientProxy(client); + auto userId = GetUserIdByCallingUid(); + auto newScbPid = IPCSkeleton::GetCallingPid(); - std::ostringstream oss; - oss << "set client userId: " << userId << " clientName: " << SysCapUtil::GetClientName(); - TLOGI(WmsLogTag::DMS, "%{public}s", oss.str().c_str()); - screenEventTracker_.RecordEvent(oss.str()); - currentUserIdForSettings_ = userId; - MockSessionManagerService::GetInstance().NotifyWMSConnected(userId, GetDefaultScreenId(), true); - NotifyClientProxyUpdateFoldDisplayMode(GetFoldDisplayMode()); - SetClientInner(); - SwitchScbNodeHandle(userId, newScbPid, true); - } - AddScbClientDeathRecipient(client, IPCSkeleton::GetCallingPid()); + std::ostringstream oss; + oss << "set client userId: " << userId << " clientName: " << SysCapUtil::GetClientName(); + TLOGI(WmsLogTag::DMS, "%{public}s", oss.str().c_str()); + screenEventTracker_.RecordEvent(oss.str()); + currentUserIdForSettings_ = userId; + MockSessionManagerService::GetInstance().NotifyWMSConnected(userId, GetDefaultScreenId(), true); + NotifyClientProxyUpdateFoldDisplayMode(GetFoldDisplayMode()); + SetClientInner(); + SwitchScbNodeHandle(userId, newScbPid, true); + + AddScbClientDeathRecipient(client, newScbPid); static bool isNeedSwitchScreen = FoldScreenStateInternel::IsSingleDisplayPocketFoldDevice() || FoldScreenStateInternel::IsSingleDisplayFoldDevice(); @@ -8625,6 +8621,7 @@ void ScreenSessionManager::SwitchScbNodeHandle(int32_t newUserId, int32_t newScb TLOGI(WmsLogTag::DMS, "%{public}s", oss.str().c_str()); screenEventTracker_.RecordEvent(oss.str()); + std::unique_lock lock(oldScbPidsMutex_); if (currentScbPId_ != INVALID_SCB_PID) { auto pidIter = std::find(oldScbPids_.begin(), oldScbPids_.end(), currentScbPId_); if (pidIter == oldScbPids_.end() && currentScbPId_ > 0) {