diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.h index 3fedbb722a975b5147a75748ad00590b89bf7f38..3fa88200ff43dfc27fcedd9646dbb92ceec34441 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.h @@ -16,6 +16,7 @@ #ifndef OHOS_DCAMERA_HDF_OPERATE_H #define OHOS_DCAMERA_HDF_OPERATE_H +#include #include #include @@ -48,8 +49,8 @@ private: int32_t WaitLoadProviderService(); private: - uint16_t cameraServStatus_ = INVALID_VALUE; - uint16_t providerServStatus_ = INVALID_VALUE; + std::atomic cameraServStatus_ = INVALID_VALUE; + std::atomic providerServStatus_ = INVALID_VALUE; std::condition_variable hdfOperateCon_; std::mutex hdfOperateMutex_; }; diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.cpp index ba2d86b7c26a9aaea030c19d5fad10ad7b71a51a..713942b3c25fff965c39953816bfad2a4c6cbfad 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamerahdf/dcamera_hdf_operate.cpp @@ -15,6 +15,7 @@ #include "dcamera_hdf_operate.h" +#include #include #include "anonymous_string.h" @@ -35,8 +36,8 @@ void DCameraHdfServStatListener::OnReceive(const ServiceStatus& status) int32_t DCameraHdfOperate::LoadDcameraHDFImpl() { - if (cameraServStatus_ == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START && - providerServStatus_ == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) { + if (cameraServStatus_.load() == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START && + providerServStatus_.load() == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) { DHLOGI("service has already start"); return DCAMERA_OK; } @@ -53,10 +54,10 @@ int32_t DCameraHdfOperate::LoadDcameraHDFImpl() status.serviceName.c_str(), status.status); std::unique_lock lock(hdfOperateMutex_); if (status.serviceName == CAMERA_SERVICE_NAME) { - cameraServStatus_ = status.status; + cameraServStatus_.store(status.status); hdfOperateCon_.notify_one(); } else if (status.serviceName == PROVIDER_SERVICE_NAME) { - providerServStatus_ = status.status; + providerServStatus_.store(status.status); hdfOperateCon_.notify_one(); } }))); @@ -66,16 +67,16 @@ int32_t DCameraHdfOperate::LoadDcameraHDFImpl() } DHLOGI("Load camera service."); - if (devmgr->LoadDevice(CAMERA_SERVICE_NAME) != 0) { - DHLOGE("Load camera service failed!"); + int32_t ret = devmgr->LoadDevice(CAMERA_SERVICE_NAME); + if (ret != HDF_SUCCESS && ret != HDF_ERR_DEVICE_BUSY) { return DCAMERA_BAD_OPERATE; } if (WaitLoadCameraService() != DCAMERA_OK) { return DCAMERA_BAD_OPERATE; } - DHLOGI("Load provider service."); - if (devmgr->LoadDevice(PROVIDER_SERVICE_NAME) != 0) { + ret = devmgr->LoadDevice(PROVIDER_SERVICE_NAME); + if (ret != HDF_SUCCESS && ret != HDF_ERR_DEVICE_BUSY) { DHLOGE("Load provider service failed!"); return DCAMERA_BAD_OPERATE; } @@ -94,11 +95,11 @@ int32_t DCameraHdfOperate::WaitLoadCameraService() DHLOGI("wait Load camera service."); std::unique_lock lock(hdfOperateMutex_); hdfOperateCon_.wait_for(lock, std::chrono::milliseconds(WAIT_TIME), [this] { - return (this->cameraServStatus_ == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START); + return (this->cameraServStatus_.load() == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START); }); - if (cameraServStatus_ != OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) { - DHLOGE("wait load cameraService failed, status %{public}d", cameraServStatus_); + if (cameraServStatus_.load() != OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) { + DHLOGE("wait load cameraService failed, status %{public}d", cameraServStatus_.load()); return DCAMERA_BAD_OPERATE; } @@ -110,11 +111,11 @@ int32_t DCameraHdfOperate::WaitLoadProviderService() DHLOGI("wait Load provider service."); std::unique_lock lock(hdfOperateMutex_); hdfOperateCon_.wait_for(lock, std::chrono::milliseconds(WAIT_TIME), [this] { - return (this->providerServStatus_ == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START); + return (this->providerServStatus_.load() == OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START); }); - if (providerServStatus_ != OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) { - DHLOGE("wait load providerService failed, status %{public}d", providerServStatus_); + if (providerServStatus_.load() != OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START) { + DHLOGE("wait load providerService failed, status %{public}d", providerServStatus_.load()); return DCAMERA_BAD_OPERATE; } @@ -138,8 +139,8 @@ int32_t DCameraHdfOperate::UnLoadDcameraHDFImpl() if (ret != 0) { DHLOGE("Unload provider service failed, ret: %d", ret); } - cameraServStatus_ = INVALID_VALUE; - providerServStatus_ = INVALID_VALUE; + cameraServStatus_.store(INVALID_VALUE); + providerServStatus_.store(INVALID_VALUE); DHLOGI("UnLoadCameraHDFImpl end!"); return DCAMERA_OK; } diff --git a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_hdf_operate_test.cpp b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_hdf_operate_test.cpp index 1b6fab4275caef14d042d218a494934d64c0dae1..8d5843ff35ae5b13703183a4a8ba798d7fbe552a 100644 --- a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_hdf_operate_test.cpp +++ b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_hdf_operate_test.cpp @@ -89,8 +89,8 @@ HWTEST_F(DCameraHdfOperateTest, dcamera_hdf_operate_test_002, TestSize.Level1) HWTEST_F(DCameraHdfOperateTest, dcamera_hdf_operate_test_003, TestSize.Level1) { DHLOGI("DCameraHdfOperateTest::dcamera_hdf_operate_test_003"); - DCameraHdfOperate::GetInstance().cameraServStatus_ = OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START; - DCameraHdfOperate::GetInstance().providerServStatus_ = OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START; + DCameraHdfOperate::GetInstance().cameraServStatus_.store(OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START); + DCameraHdfOperate::GetInstance().providerServStatus_.store(OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_START); int32_t ret = DCameraHdfOperate::GetInstance().LoadDcameraHDFImpl(); EXPECT_EQ(DCAMERA_OK, ret); } @@ -104,7 +104,7 @@ HWTEST_F(DCameraHdfOperateTest, dcamera_hdf_operate_test_003, TestSize.Level1) HWTEST_F(DCameraHdfOperateTest, dcamera_hdf_operate_test_004, TestSize.Level1) { DHLOGI("DCameraHdfOperateTest::dcamera_hdf_operate_test_004"); - DCameraHdfOperate::GetInstance().cameraServStatus_ = OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_STOP; + DCameraHdfOperate::GetInstance().cameraServStatus_.store(OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_STOP); int32_t ret = DCameraHdfOperate::GetInstance().WaitLoadCameraService(); EXPECT_EQ(DCAMERA_BAD_OPERATE, ret); } @@ -118,7 +118,7 @@ HWTEST_F(DCameraHdfOperateTest, dcamera_hdf_operate_test_004, TestSize.Level1) HWTEST_F(DCameraHdfOperateTest, dcamera_hdf_operate_test_005, TestSize.Level1) { DHLOGI("DCameraHdfOperateTest::dcamera_hdf_operate_test_005"); - DCameraHdfOperate::GetInstance().providerServStatus_ = OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_STOP; + DCameraHdfOperate::GetInstance().providerServStatus_.store(OHOS::HDI::ServiceManager::V1_0::SERVIE_STATUS_STOP); int32_t ret = DCameraHdfOperate::GetInstance().WaitLoadProviderService(); EXPECT_EQ(DCAMERA_BAD_OPERATE, ret); }