diff --git a/services/cameraservice/sourceservice/include/distributedcamera/distributed_camera_source_service.h b/services/cameraservice/sourceservice/include/distributedcamera/distributed_camera_source_service.h index 6dfb6ee57afa6473ab36a8a4fa3b12d0f927c23e..740885a64bd2edbe4a732562bec500f4e36dfcf8 100644 --- a/services/cameraservice/sourceservice/include/distributedcamera/distributed_camera_source_service.h +++ b/services/cameraservice/sourceservice/include/distributedcamera/distributed_camera_source_service.h @@ -44,7 +44,10 @@ public: const std::string& reqId) override; int32_t DCameraNotify(const std::string& devId, const std::string& dhId, std::string& events) override; - static std::map> camerasMap_; + static void CamDevInsert(DCameraIndex& index, std::shared_ptr& camDev); + static std::shared_ptr GetCamDevByIndex(DCameraIndex& index); + static void CamDevErase(DCameraIndex& index); + static uint32_t GetCamDevNum(); protected: void OnStart() override; @@ -61,6 +64,9 @@ private: sptr callbackProxy_; std::string sourceVer_; + const size_t MAX_CAMERAS_NUMBER = 32; + static std::map> camerasMap_; + static std::mutex camDevMutex_; }; } } diff --git a/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp b/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp index 0913e392a95c6f0413c2bfaccd84dbed4dc0928b..21742524c1006087661e23fc192d164497399942 100644 --- a/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp +++ b/services/cameraservice/sourceservice/src/distributedcamera/dcamera_service_state_listener.cpp @@ -56,7 +56,7 @@ int32_t DCameraServiceStateListener::OnRegisterNotify(const std::string& devId, DHLOGI("DCameraServiceStateListener OnRegisterNotify thread delete devId: %s dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); DCameraIndex camIndex(devId, dhId); - DistributedCameraSourceService::camerasMap_.erase(camIndex); + DistributedCameraSourceService::CamDevErase(camIndex); }).detach(); } return ret; @@ -82,7 +82,7 @@ int32_t DCameraServiceStateListener::OnUnregisterNotify(const std::string& devId DHLOGI("DCameraServiceStateListener OnUnregisterNotify thread delete devId: %s dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); DCameraIndex camIndex(devId, dhId); - DistributedCameraSourceService::camerasMap_.erase(camIndex); + DistributedCameraSourceService::CamDevErase(camIndex); }).detach(); } diff --git a/services/cameraservice/sourceservice/src/distributedcamera/distributed_camera_source_service.cpp b/services/cameraservice/sourceservice/src/distributedcamera/distributed_camera_source_service.cpp index fde25868584b29623854ce6876deccc3112ec3bf..fbfef9e3474460d45b2b79b96a80af039c873719 100644 --- a/services/cameraservice/sourceservice/src/distributedcamera/distributed_camera_source_service.cpp +++ b/services/cameraservice/sourceservice/src/distributedcamera/distributed_camera_source_service.cpp @@ -33,6 +33,7 @@ namespace DistributedHardware { REGISTER_SYSTEM_ABILITY_BY_ID(DistributedCameraSourceService, DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, true); std::map> DistributedCameraSourceService::camerasMap_; +std::mutex DistributedCameraSourceService::camDevMutex_; DistributedCameraSourceService::DistributedCameraSourceService(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate) @@ -110,11 +111,14 @@ int32_t DistributedCameraSourceService::RegisterDistributedHardware(const std::s { DHLOGI("DistributedCameraSourceService RegisterDistributedHardware devId: %s, dhId: %s, version: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), param.version.c_str()); + if (GetCamDevNum() > MAX_CAMERAS_NUMBER) { + DHLOGE("DistributedCameraSourceService RegisterDistributedHardware cameras exceed the upper limit"); + return DCAMERA_BAD_VALUE; + } DCameraIndex camIndex(devId, dhId); - std::shared_ptr camDev = nullptr; int32_t ret = DCAMERA_OK; - auto iter = camerasMap_.find(camIndex); - if (iter == camerasMap_.end()) { + std::shared_ptr camDev = GetCamDevByIndex(camIndex); + if (camDev == nullptr) { DHLOGI("DistributedCameraSourceService RegisterDistributedHardware new dev devId: %s, dhId: %s, version: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), param.version.c_str()); std::shared_ptr listener = std::make_shared(callbackProxy_); @@ -128,17 +132,17 @@ int32_t DistributedCameraSourceService::RegisterDistributedHardware(const std::s ret, GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); return ret; } - camerasMap_.emplace(camIndex, camDev); + CamDevInsert(camIndex, camDev); } else { - DHLOGI("DistributedCameraSourceService RegisterDistributedHardware exist devId: %s, dhId: %s, version: %s", + DHLOGE("DistributedCameraSourceService RegisterDistributedHardware exist devId: %s, dhId: %s, version: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), param.version.c_str()); - camDev = iter->second; + return DCAMERA_ALREADY_EXISTS; } ret = camDev->RegisterDistributedHardware(devId, dhId, reqId, param.version, param.attrs); if (ret != DCAMERA_OK) { DHLOGE("DistributedCameraSourceService RegisterDistributedHardware failed, ret: %d", ret); - camerasMap_.erase(camIndex); + CamDevErase(camIndex); } DHLOGI("DistributedCameraSourceService RegisterDistributedHardware end devId: %s, dhId: %s, version: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), param.version.c_str()); @@ -151,13 +155,12 @@ int32_t DistributedCameraSourceService::UnregisterDistributedHardware(const std: DHLOGI("DistributedCameraSourceService UnregisterDistributedHardware devId: %s, dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); DCameraIndex camIndex(devId, dhId); - auto iter = camerasMap_.find(camIndex); - if (iter == camerasMap_.end()) { + std::shared_ptr camDev = GetCamDevByIndex(camIndex); + if (camDev == nullptr) { DHLOGE("DistributedCameraSourceService UnregisterDistributedHardware not found device"); return DCAMERA_NOT_FOUND; } - std::shared_ptr camDev = iter->second; int32_t ret = camDev->UnRegisterDistributedHardware(devId, dhId, reqId); if (ret != DCAMERA_OK) { DHLOGE("DistributedCameraSourceService UnregisterDistributedHardware failed, ret: %d", ret); @@ -171,13 +174,12 @@ int32_t DistributedCameraSourceService::DCameraNotify(const std::string& devId, DHLOGI("DistributedCameraSourceService DCameraNotify devId: %s, dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); DCameraIndex camIndex(devId, dhId); - auto iter = camerasMap_.find(camIndex); - if (iter == camerasMap_.end()) { + std::shared_ptr camDev = GetCamDevByIndex(camIndex); + if (camDev == nullptr) { DHLOGE("DistributedCameraSourceService DCameraNotify not found device"); return DCAMERA_NOT_FOUND; } - std::shared_ptr camDev = iter->second; int32_t ret = camDev->DCameraNotify(events); if (ret != DCAMERA_OK) { DHLOGE("DistributedCameraSourceService DCameraNotify failed, ret: %d", ret); @@ -194,5 +196,33 @@ int32_t DistributedCameraSourceService::UnLoadCameraHDF() { return DCAMERA_OK; } + +void DistributedCameraSourceService::CamDevInsert(DCameraIndex& index, std::shared_ptr& camDev) +{ + std::lock_guard camLock(camDevMutex_); + camerasMap_.emplace(index, camDev); +} + +std::shared_ptr DistributedCameraSourceService::GetCamDevByIndex(DCameraIndex& index) +{ + std::lock_guard camLock(camDevMutex_); + auto iter = camerasMap_.find(index); + if (iter == camerasMap_.end()) { + return nullptr; + } + return iter->second; +} + +void DistributedCameraSourceService::CamDevErase(DCameraIndex& index) +{ + std::lock_guard camLock(camDevMutex_); + camerasMap_.erase(index); +} + +uint32_t DistributedCameraSourceService::GetCamDevNum() +{ + std::lock_guard camLock(camDevMutex_); + return camerasMap_.size(); +} } } \ No newline at end of file