From 70e578cd5c5038effdd2ceb46cf915efdd4f3106 Mon Sep 17 00:00:00 2001 From: zhangchao Date: Wed, 15 Nov 2023 11:32:34 +0800 Subject: [PATCH] add a lock to the deviceSvcCallback_ Signed-off-by: zhangchao --- .../camera_service/include/hcamera_device.h | 1 + .../camera_service/src/hcamera_device.cpp | 33 +++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/services/camera_service/include/hcamera_device.h b/services/camera_service/include/hcamera_device.h index 924f5b31b..cec609e2e 100644 --- a/services/camera_service/include/hcamera_device.h +++ b/services/camera_service/include/hcamera_device.h @@ -67,6 +67,7 @@ private: bool isReleaseCameraDevice_; bool isOpenedCameraDevice_; + std::mutex deviceSvcCbMutex_; sptr deviceSvcCallback_; sptr deviceHDICallback_; std::map> statusSvcCallbacks_; diff --git a/services/camera_service/src/hcamera_device.cpp b/services/camera_service/src/hcamera_device.cpp index 5e07ae797..3be039aae 100644 --- a/services/camera_service/src/hcamera_device.cpp +++ b/services/camera_service/src/hcamera_device.cpp @@ -42,6 +42,7 @@ HCameraDevice::~HCameraDevice() cameraHostManager_ = nullptr; } deviceHDICallback_ = nullptr; + std::lock_guard lock(deviceSvcCbMutex_); deviceSvcCallback_ = nullptr; } @@ -164,21 +165,24 @@ int32_t HCameraDevice::OpenHdiCamera() int32_t HCameraDevice::Close() { CAMERA_SYNC_TRACE; - std::lock_guard lock(deviceLock_); - if (hdiCameraDevice_ != nullptr) { - MEDIA_INFO_LOG("HCameraDevice::Close Closing camera device: %{public}s", cameraID_.c_str()); - hdiCameraDevice_->Close(); - (void)OnCameraStatus(cameraID_, CAMERA_STATUS_AVAILABLE); - } - isOpenedCameraDevice_ = false; - hdiCameraDevice_ = nullptr; - if (streamOperator_) { - streamOperator_ = nullptr; - } - if (cameraHostManager_) { - cameraHostManager_->RemoveCameraDevice(cameraID_); + { + std::lock_guard lock(deviceLock_); + if (hdiCameraDevice_ != nullptr) { + MEDIA_INFO_LOG("HCameraDevice::Close Closing camera device: %{public}s", cameraID_.c_str()); + hdiCameraDevice_->Close(); + (void)OnCameraStatus(cameraID_, CAMERA_STATUS_AVAILABLE); + } + isOpenedCameraDevice_ = false; + hdiCameraDevice_ = nullptr; + if (streamOperator_) { + streamOperator_ = nullptr; + } + if (cameraHostManager_) { + cameraHostManager_->RemoveCameraDevice(cameraID_); + } } deviceHDICallback_ = nullptr; + std::lock_guard lock(deviceSvcCbMutex_); deviceSvcCallback_ = nullptr; return CAMERA_OK; } @@ -398,6 +402,7 @@ int32_t HCameraDevice::SetCallback(sptr &callback) MEDIA_ERR_LOG("HCameraDevice::SetCallback callback is null"); return CAMERA_INVALID_ARG; } + std::lock_guard lock(deviceSvcCbMutex_); deviceSvcCallback_ = callback; return CAMERA_OK; } @@ -448,6 +453,7 @@ sptr HCameraDevice::GetStreamOperator() int32_t HCameraDevice::OnError(const ErrorType type, const int32_t errorMsg) { + std::lock_guard lock(deviceSvcCbMutex_); if (deviceSvcCallback_ != nullptr) { int32_t errorType; if (type == REQUEST_TIMEOUT) { @@ -487,6 +493,7 @@ int32_t HCameraDevice::OnCameraStatus(const std::string& cameraId, CameraStatus int32_t HCameraDevice::OnResult(const uint64_t timestamp, const std::shared_ptr &result) { + std::lock_guard lock(deviceSvcCbMutex_); if (deviceSvcCallback_ != nullptr) { deviceSvcCallback_->OnResult(timestamp, result); } -- Gitee