From c30480af91bb3b45d7a17f14d6f6f8d68fbdb3b6 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 28 Sep 2020 19:11:47 -0500 Subject: [PATCH] Add detection progress callback to avoid unnecessary device list updates --- ResourceManager.cpp | 35 +++++++++++++++++++++++++++++++---- ResourceManager.h | 16 +++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 30bd8410..ff204122 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -89,12 +89,18 @@ void ResourceManager::RegisterDeviceDetector(std::string name, DeviceDetectorFun device_detectors.push_back(detector); } -void ResourceManager::RegisterDeviceListChangeCallback(ResourceManagerCallback new_callback, void * new_callback_arg) +void ResourceManager::RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg) { DeviceListChangeCallbacks.push_back(new_callback); DeviceListChangeCallbackArgs.push_back(new_callback_arg); } +void ResourceManager::RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void *new_callback_arg) +{ + DetectionProgressCallbacks.push_back(new_callback); + DetectionProgressCallbackArgs.push_back(new_callback_arg); +} + void ResourceManager::DeviceListChanged() { DeviceListChangeMutex.lock(); @@ -116,6 +122,27 @@ void ResourceManager::DeviceListChanged() DeviceListChangeMutex.unlock(); } +void ResourceManager::DetectionProgressChanged() +{ + DetectionProgressMutex.lock(); + + /*-------------------------------------------------*\ + | Detection progress has changed, call the callbacks| + \*-------------------------------------------------*/ + for(unsigned int callback_idx = 0; callback_idx < DetectionProgressCallbacks.size(); callback_idx++) + { + DetectionProgressCallbacks[callback_idx](DetectionProgressCallbackArgs[callback_idx]); + } + + /*-------------------------------------------------*\ + | Device list has changed, inform all clients | + | connected to this server | + \*-------------------------------------------------*/ + server->DeviceListChanged(); + + DetectionProgressMutex.unlock(); +} + NetworkServer* ResourceManager::GetServer() { return(server); @@ -236,7 +263,7 @@ void ResourceManager::DetectDevicesThreadFunction() for(unsigned int i2c_detector_idx = 0; i2c_detector_idx < i2c_device_detectors.size() && detection_is_required.load(); i2c_detector_idx++) { detection_string = i2c_device_detector_strings[i2c_detector_idx].c_str(); - DeviceListChanged(); + DetectionProgressChanged(); bool this_device_disabled = false; for(std::size_t disabled_idx = 0; disabled_idx < disabled_devices_list.size(); disabled_idx++) @@ -274,7 +301,7 @@ void ResourceManager::DetectDevicesThreadFunction() for(unsigned int detector_idx = 0; detector_idx < device_detectors.size() && detection_is_required.load(); detector_idx++) { detection_string = device_detector_strings[detector_idx].c_str(); - DeviceListChanged(); + DetectionProgressChanged(); bool this_device_disabled = false; for(std::size_t disabled_idx = 0; disabled_idx < disabled_devices_list.size(); disabled_idx++) @@ -317,7 +344,7 @@ void ResourceManager::DetectDevicesThreadFunction() detection_percent = 100; detection_string = ""; - DeviceListChanged(); + DetectionProgressChanged(); DetectDeviceMutex.unlock(); } diff --git a/ResourceManager.h b/ResourceManager.h index 98ea84f9..321e54b5 100644 --- a/ResourceManager.h +++ b/ResourceManager.h @@ -26,7 +26,8 @@ typedef std::function&)> typedef std::function&)> DeviceDetectorFunction; typedef std::function&, std::vector&)> I2CDeviceDetectorFunction; -typedef void (*ResourceManagerCallback)(void *); +typedef void (*DeviceListChangeCallback)(void *); +typedef void (*DetectionProgressCallback)(void *); class ResourceManager { @@ -46,7 +47,8 @@ public: void RegisterDeviceDetector (std::string name, DeviceDetectorFunction detector); void RegisterI2CDeviceDetector (std::string name, I2CDeviceDetectorFunction detector); - void RegisterDeviceListChangeCallback(ResourceManagerCallback new_callback, void * new_callback_arg); + void RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg); + void RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void * new_callback_arg); unsigned int GetDetectionPercent(); const char* GetDetectionString(); @@ -55,6 +57,7 @@ public: NetworkServer* GetServer(); void DeviceListChanged(); + void DetectionProgressChanged(); void Cleanup(); @@ -113,6 +116,13 @@ private: | Device List Changed Callback | \*-------------------------------------------------------------------------------------*/ std::mutex DeviceListChangeMutex; - std::vector DeviceListChangeCallbacks; + std::vector DeviceListChangeCallbacks; std::vector DeviceListChangeCallbackArgs; + + /*-------------------------------------------------------------------------------------*\ + | Detection Progress Callback | + \*-------------------------------------------------------------------------------------*/ + std::mutex DetectionProgressMutex; + std::vector DetectionProgressCallbacks; + std::vector DetectionProgressCallbackArgs; };