diff --git a/services/camera_service/include/hcamera_device.h b/services/camera_service/include/hcamera_device.h index 924f5b31b64b67826de7e86c3cbdd4b9e3f87188..cec609e2e90b1f9a79394b58899c3deb735ac212 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 5e07ae7979351871f56f04f759ffa4a63641baf7..3be039aae15b48d9c517857ff30d42972ab9b165 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); }