diff --git a/services/services/screen_capture/ipc/screen_capture_controller_stub.cpp b/services/services/screen_capture/ipc/screen_capture_controller_stub.cpp index 1884e8547b9b861b83c7496d26481ad811fa37ad..b68a5762ed75a87d45b9f82cc8425f72c45bc22a 100644 --- a/services/services/screen_capture/ipc/screen_capture_controller_stub.cpp +++ b/services/services/screen_capture/ipc/screen_capture_controller_stub.cpp @@ -79,6 +79,7 @@ int ScreenCaptureControllerStub::OnRemoteRequest(uint32_t code, MessageParcel &d if (itFunc != screenCaptureControllerStubFuncs_.end()) { auto memberFunc = itFunc->second; if (memberFunc != nullptr) { + std::lock_guard lock(mutex_); int32_t ret = (this->*memberFunc)(data, reply); if (ret != MSERR_OK) { MEDIA_LOGE("Calling memberFunc is failed."); diff --git a/services/services/screen_capture/server/screen_capture_server.cpp b/services/services/screen_capture/server/screen_capture_server.cpp index 3fa90234b7ea1cb0895f63f72c7da86cecfb5d47..a1a6707ce0ab07fcf64e8e85a93373d02f79aca3 100644 --- a/services/services/screen_capture/server/screen_capture_server.cpp +++ b/services/services/screen_capture/server/screen_capture_server.cpp @@ -383,9 +383,13 @@ void ScreenCaptureServer::SetDefaultDisplayIdOfWindows() uint64_t defaultDisplayId = defaultDisplay->GetScreenId(); std::unordered_map windowDisplayIdMap; - auto ret = WindowManager::GetInstance().GetDisplayIdByWindowId(missionIds_, windowDisplayIdMap); - CHECK_AND_RETURN_LOG(ret == Rosen::WMError::WM_OK, "SetDefaultDisplayIdOfWindows GetDisplayIdByWindowId failed"); - MEDIA_LOGI("SetDefaultDisplayIdOfWindows GetDisplayIdByWindowId ret: %{public}d", ret); + { + std::shared_lock read_lock(rw_lock_); + auto ret = WindowManager::GetInstance().GetDisplayIdByWindowId(missionIds_, windowDisplayIdMap); + CHECK_AND_RETURN_LOG(ret == Rosen::WMError::WM_OK, + "SetDefaultDisplayIdOfWindows GetDisplayIdByWindowId failed"); + MEDIA_LOGI("SetDefaultDisplayIdOfWindows GetDisplayIdByWindowId ret: %{public}d", ret); + } for (const auto& pair : windowDisplayIdMap) { MEDIA_LOGD("SetDefaultDisplayIdOfWindows 0x%{public}06" PRIXPTR " WindowId:%{public}" PRIu64 " in DisplayId:%{public}" PRIu64, FAKE_POINTER(this), pair.first, pair.second); @@ -1047,6 +1051,7 @@ void ScreenCaptureServer::SetDisplayId(uint64_t displayId) void ScreenCaptureServer::SetMissionId(uint64_t missionId) { + std::unique_lock write_lock(rw_lock_); missionIds_.emplace_back(missionId); } @@ -2004,22 +2009,13 @@ void ScreenCaptureServer::PostStartScreenCapture(bool isSuccess) MEDIA_LOGI("PostStartScreenCaptureSuccessAction START."); PostStartScreenCaptureSuccessAction(); } else { - MEDIA_LOGE("PostStartScreenCapture handle failure"); - if (isPrivacyAuthorityEnabled_) { - screenCaptureCb_->OnError(ScreenCaptureErrorType::SCREEN_CAPTURE_ERROR_INTERNAL, - AVScreenCaptureErrorCode::SCREEN_CAPTURE_ERR_UNKNOWN); - } - StopScreenCaptureInner(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID); - isPrivacyAuthorityEnabled_ = false; - isSurfaceMode_ = false; - captureState_ = AVScreenCaptureState::STOPPED; - SetErrorInfo(MSERR_UNKNOWN, "PostStartScreenCapture handle failure", - StopReason::POST_START_SCREENCAPTURE_HANDLE_FAILURE, IsUserPrivacyAuthorityNeeded()); + PostStartScreenCaptureFail(); return; } RegisterPrivateWindowListener(); RegisterScreenConnectListener(); RegisterLanguageSwitchListener(); + std::shared_lock read_lock(rw_lock_); if (captureConfig_.captureMode == CAPTURE_SPECIFIED_WINDOW && missionIds_.size() == 1) { SetWindowIdList(missionIds_.front()); SetDefaultDisplayIdOfWindows(); @@ -2028,6 +2024,21 @@ void ScreenCaptureServer::PostStartScreenCapture(bool isSuccess) MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " PostStartScreenCapture end.", FAKE_POINTER(this)); } +void ScreenCaptureServer::PostStartScreenCaptureFail() +{ + MEDIA_LOGE("PostStartScreenCapture handle failure"); + if (isPrivacyAuthorityEnabled_) { + screenCaptureCb_->OnError(ScreenCaptureErrorType::SCREEN_CAPTURE_ERROR_INTERNAL, + AVScreenCaptureErrorCode::SCREEN_CAPTURE_ERR_UNKNOWN); + } + StopScreenCaptureInner(AVScreenCaptureStateCode::SCREEN_CAPTURE_STATE_INVLID); + isPrivacyAuthorityEnabled_ = false; + isSurfaceMode_ = false; + captureState_ = AVScreenCaptureState::STOPPED; + SetErrorInfo(MSERR_UNKNOWN, "PostStartScreenCapture handle failure", + StopReason::POST_START_SCREENCAPTURE_HANDLE_FAILURE, IsUserPrivacyAuthorityNeeded()); +} + #ifdef SUPPORT_SCREEN_CAPTURE_WINDOW_NOTIFICATION int32_t ScreenCaptureServer::TryStartNotification() { @@ -2908,6 +2919,7 @@ int32_t ScreenCaptureServer::CreateVirtualScreen(const std::string &name, sptrGetHeight(), display->GetVirtualPixelRatio()); virScrOption.density_ = display->GetVirtualPixelRatio(); } + std::shared_lock read_lock(rw_lock_); if (missionIds_.size() > 0 && captureConfig_.captureMode == CAPTURE_SPECIFIED_WINDOW) { virScrOption.missionIds_ = missionIds_; } else if (captureConfig_.videoInfo.videoCapInfo.taskIDs.size() > 0 && @@ -2987,6 +2999,7 @@ int32_t ScreenCaptureServer::PrepareVirtualScreenMirror() uint64_t ScreenCaptureServer::GetDisplayIdOfWindows(uint64_t displayId) { uint64_t defaultDisplayIdValue = displayId; + std::shared_lock read_lock(rw_lock_); if (missionIds_.size() > 0) { std::unordered_map windowDisplayIdMap; auto ret = WindowManager::GetInstance().GetDisplayIdByWindowId(missionIds_, windowDisplayIdMap); @@ -3207,6 +3220,7 @@ VirtualScreenOption ScreenCaptureServer::InitVirtualScreenOption(const std::stri MediaTrace trace("ScreenCaptureServer::InitVirtualScreenOption"); MEDIA_LOGI("ScreenCaptureServer: 0x%{public}06" PRIXPTR " InitVirtualScreenOption start, name:%{public}s.", FAKE_POINTER(this), name.c_str()); + std::unique_lock write_lock(rw_lock_); VirtualScreenOption virScrOption = { .name_ = name, .width_ = captureConfig_.videoInfo.videoCapInfo.videoFrameWidth, diff --git a/services/services/screen_capture/server/screen_capture_server.h b/services/services/screen_capture/server/screen_capture_server.h index d952083e7a4a67877ccd5492965dc07d321716ca..5329431e6ffb9a74436b76a1e571e455db66d62d 100644 --- a/services/services/screen_capture/server/screen_capture_server.h +++ b/services/services/screen_capture/server/screen_capture_server.h @@ -161,6 +161,7 @@ private: bool IsFirstStartPidInstance(int32_t pid); bool FirstPidUpdatePrivacyUsingPermissionState(int32_t pid); void PostStartScreenCapture(bool isSuccess); + void PostStartScreenCaptureFail(); void PostStartScreenCaptureSuccessAction(); int32_t InitRecorderInfo(std::shared_ptr &recorder, AudioCaptureInfo audioInfo); int32_t InitRecorderMix(); @@ -284,6 +285,7 @@ private: std::mutex mutex_; std::mutex cbMutex_; std::mutex inCallMutex_; + mutable std::shared_mutex rw_lock_; std::shared_ptr screenCaptureObserverCb_ = nullptr; std::shared_ptr screenCaptureCb_ = nullptr; bool canvasRotation_ = false;