diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 53f5bd9d..efe259c3 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -474,6 +474,15 @@ void ResourceManager::Cleanup() delete rgb_controller; } + std::vector busses_copy = busses; + + busses.clear(); + + for(i2c_smbus_interface* bus : busses_copy) + { + delete bus; + } + /*-------------------------------------------------*\ | Cleanup HID interface | \*-------------------------------------------------*/ @@ -636,18 +645,14 @@ void ResourceManager::DetectDevicesThreadFunction() detection_percent = 0; /*-------------------------------------------------*\ - | Detect i2c interfaces - only perform on first | - | detection | + | Detect i2c interfaces | \*-------------------------------------------------*/ - if(busses.empty()) - { - LOG_NOTICE("Detecting I2C interfaces"); + LOG_NOTICE("Detecting I2C interfaces"); - for(unsigned int i2c_bus_detector_idx = 0; i2c_bus_detector_idx < i2c_bus_detectors.size() && detection_is_required.load(); i2c_bus_detector_idx++) - { - i2c_bus_detectors[i2c_bus_detector_idx](); - I2CBusListChanged(); - } + for(unsigned int i2c_bus_detector_idx = 0; i2c_bus_detector_idx < i2c_bus_detectors.size() && detection_is_required.load(); i2c_bus_detector_idx++) + { + i2c_bus_detectors[i2c_bus_detector_idx](); + I2CBusListChanged(); } /*-------------------------------------------------*\ diff --git a/wmi/wmi.cpp b/wmi/wmi.cpp index 3e6eb653..5785c74e 100644 --- a/wmi/wmi.cpp +++ b/wmi/wmi.cpp @@ -147,6 +147,18 @@ HRESULT Wmi::query(std::string queryStr, std::vector& queryVectorOut, int nIdx = 0; IEnumWbemClassObject* pEnumerator = nullptr; + // Reconnect to server before each query as we were seeing disconnected failures + hres = pLoc->ConnectServer( + _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace + nullptr, // User name. NULL = current user + nullptr, // User password. NULL = current + nullptr, // Locale. NULL indicates current + 0, // Security flags. + nullptr, // Authority (for example, Kerberos) + nullptr, // Context object + &pSvc // pointer to IWbemServices proxy + ); + // Make the WMI query hres = pSvc->ExecQuery( bstr_t("WQL"),