From 92589c2ce7012c70e111c139a77d469a02d6def8 Mon Sep 17 00:00:00 2001 From: Paul Hollinsky Date: Wed, 21 Apr 2021 10:04:25 -0400 Subject: [PATCH] Device: Make IO system thread-safe --- device/device.cpp | 2 ++ include/icsneo/device/device.h | 2 ++ include/icsneo/device/tree/neovifire2/neovifire2.h | 1 + include/icsneo/device/tree/plasion/plasion.h | 1 + include/icsneo/device/tree/radgalaxy/radgalaxy.h | 1 + include/icsneo/device/tree/radgigalog/radgigalog.h | 1 + include/icsneo/device/tree/radgigastar/radgigastar.h | 1 + include/icsneo/device/tree/valuecan4/valuecan4-2el.h | 1 + 8 files changed, 10 insertions(+) diff --git a/device/device.cpp b/device/device.cpp index 65b45be..639f0f4 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -432,6 +432,7 @@ optional Device::getDigitalIO(IO type, size_t number /* = 1 */) { return false; } + std::lock_guard lk(ioMutex); switch(type) { case IO::EthernetActivation: if(getEthernetActivationLineCount() < number) @@ -481,6 +482,7 @@ bool Device::setDigitalIO(IO type, size_t number, bool value) { return false; } + std::lock_guard lk(ioMutex); switch(type) { case IO::EthernetActivation: if(getEthernetActivationLineCount() < number) diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index 39aab48..4b38268 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -144,6 +144,8 @@ protected: int messagePollingCallbackID = 0; int internalHandlerCallbackID = 0; device_eventhandler_t report; + + std::mutex ioMutex; optional ethActivationStatus; optional usbHostPowerStatus; optional backupPowerEnabled; diff --git a/include/icsneo/device/tree/neovifire2/neovifire2.h b/include/icsneo/device/tree/neovifire2/neovifire2.h index c0e1242..03f66a9 100644 --- a/include/icsneo/device/tree/neovifire2/neovifire2.h +++ b/include/icsneo/device/tree/neovifire2/neovifire2.h @@ -95,6 +95,7 @@ protected: void handleDeviceStatus(const std::shared_ptr& message) override { if(!message || message->data.size() < sizeof(neovifire2_status_t)) return; + std::lock_guard lk(ioMutex); const neovifire2_status_t* status = reinterpret_cast(message->data.data()); backupPowerEnabled = status->backupPowerEnabled; backupPowerGood = status->backupPowerGood; diff --git a/include/icsneo/device/tree/plasion/plasion.h b/include/icsneo/device/tree/plasion/plasion.h index c1d5926..254539b 100644 --- a/include/icsneo/device/tree/plasion/plasion.h +++ b/include/icsneo/device/tree/plasion/plasion.h @@ -98,6 +98,7 @@ protected: void handleDeviceStatus(const std::shared_ptr& message) override { if(!message || message->data.size() < sizeof(fire2vnet_status_t)) return; + std::lock_guard lk(ioMutex); const fire2vnet_status_t* status = reinterpret_cast(message->data.data()); ethActivationStatus = status->ethernetActivationLineEnabled; } diff --git a/include/icsneo/device/tree/radgalaxy/radgalaxy.h b/include/icsneo/device/tree/radgalaxy/radgalaxy.h index 6a43b76..dcf5b32 100644 --- a/include/icsneo/device/tree/radgalaxy/radgalaxy.h +++ b/include/icsneo/device/tree/radgalaxy/radgalaxy.h @@ -121,6 +121,7 @@ protected: void handleDeviceStatus(const std::shared_ptr& message) override { if(!message || message->data.size() < sizeof(radgalaxy_status_t)) return; + std::lock_guard lk(ioMutex); const radgalaxy_status_t* status = reinterpret_cast(message->data.data()); ethActivationStatus = status->ethernetActivationLineEnabled; } diff --git a/include/icsneo/device/tree/radgigalog/radgigalog.h b/include/icsneo/device/tree/radgigalog/radgigalog.h index b8eeb02..6adc69d 100644 --- a/include/icsneo/device/tree/radgigalog/radgigalog.h +++ b/include/icsneo/device/tree/radgigalog/radgigalog.h @@ -80,6 +80,7 @@ protected: void handleDeviceStatus(const std::shared_ptr& message) override { if(!message || message->data.size() < sizeof(radgigalog_status_t)) return; + std::lock_guard lk(ioMutex); const radgigalog_status_t* status = reinterpret_cast(message->data.data()); ethActivationStatus = status->ethernetActivationLineEnabled; } diff --git a/include/icsneo/device/tree/radgigastar/radgigastar.h b/include/icsneo/device/tree/radgigastar/radgigastar.h index e85d277..3842a11 100644 --- a/include/icsneo/device/tree/radgigastar/radgigastar.h +++ b/include/icsneo/device/tree/radgigastar/radgigastar.h @@ -84,6 +84,7 @@ protected: void handleDeviceStatus(const std::shared_ptr& message) override { if(!message || message->data.size() < sizeof(radgigastar_status_t)) return; + std::lock_guard lk(ioMutex); const radgigastar_status_t* status = reinterpret_cast(message->data.data()); ethActivationStatus = status->ethernetActivationLineEnabled; } diff --git a/include/icsneo/device/tree/valuecan4/valuecan4-2el.h b/include/icsneo/device/tree/valuecan4/valuecan4-2el.h index 87e8e59..1bccb88 100644 --- a/include/icsneo/device/tree/valuecan4/valuecan4-2el.h +++ b/include/icsneo/device/tree/valuecan4/valuecan4-2el.h @@ -58,6 +58,7 @@ protected: void handleDeviceStatus(const std::shared_ptr& message) override { if(!message || message->data.size() < sizeof(valuecan4_2el_status_t)) return; + std::lock_guard lk(ioMutex); const valuecan4_2el_status_t* status = reinterpret_cast(message->data.data()); ethActivationStatus = status->ethernetActivationLineEnabled; }