diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp index 9bedd0780f2ac27cbff41ef5b7cdd723e3d8da82..84521faef049c7daa41bdae48051ae3cc2363bb6 100644 --- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp +++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp @@ -70,7 +70,11 @@ namespace armarx void ControlDevicesWidget::controlDeviceStatusChanged(const ControlDeviceStatus& status) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex, std::defer_lock}; + if (!guard.try_lock_for(std::chrono::microseconds(100))) + { + return; + } if (statusUpdates[status.deviceName].timestampUSec < status.timestampUSec) { statusUpdates[status.deviceName] = status; @@ -98,7 +102,7 @@ namespace armarx { auto temp = robotUnit->getControlDeviceDescriptions(); { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; resetData = std::move(temp); } } @@ -116,7 +120,7 @@ namespace armarx void ControlDevicesWidget::add(const ControlDeviceDescription& desc) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; if (entries.count(desc.deviceName)) { return; @@ -126,7 +130,7 @@ namespace armarx void ControlDevicesWidget::update(const ControlDeviceStatus& status) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; if (!robotUnit || ! robotUnit->isRunning()) { return; diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp index 03ce425d248f8408c418884f4e8a11c12134a2ae..f4462a47070fa62ea3d76d35a11b41075186e1ac 100644 --- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp +++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp @@ -90,7 +90,7 @@ namespace armarx void NJointControllerClassesWidget::nJointControllerClassAdded(std::string name) { RobotUnitInterfacePrx ru; - std::unique_lock<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; if (!robotUnit) { return; @@ -155,7 +155,7 @@ namespace armarx { auto temp = robotUnit->getNJointControllerClassDescriptions(); { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; for (NJointControllerClassDescription& ds : temp) { nJointControllerClassDescriptions[ds.className] = std::move(ds); @@ -216,7 +216,7 @@ namespace armarx void NJointControllerClassesWidget::add(const NJointControllerClassDescription& desc) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; if (entries.count(desc.className)) { return; diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp index d0289b8aebee6d7f45a67b08747393d60ed30fe0..554ee4780dfabfbb8f75508a3f4f1c9edc2a35b8 100644 --- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp +++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp @@ -89,7 +89,11 @@ namespace armarx void NJointControllersWidget::nJointControllerStatusChanged(const NJointControllerStatus& status) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex, std::defer_lock}; + if (!guard.try_lock_for(std::chrono::microseconds(100))) + { + return; + } if (statusUpdates[status.instanceName].timestampUSec < status.timestampUSec) { statusUpdates[status.instanceName] = status; @@ -108,7 +112,7 @@ namespace armarx void NJointControllersWidget::onPushButtonStopAll_clicked() { - if(robotUnit) + if (robotUnit) { robotUnit->switchNJointControllerSetup({}); } @@ -133,7 +137,7 @@ namespace armarx void NJointControllersWidget::nJointControllerCreated(std::string name) { RobotUnitInterfacePrx ru; - std::unique_lock<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; if (isResetting || !robotUnit || entries.count(name)) { return; @@ -151,7 +155,7 @@ namespace armarx void NJointControllersWidget::nJointControllerDeleted(std::string name) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; controllersDeleted.emplace(name); QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection); } @@ -226,7 +230,7 @@ namespace armarx { auto temp = robotUnit->getNJointControllerDescriptionsWithStatuses(); { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; for (NJointControllerDescriptionWithStatus& ds : temp) { controllersCreated[ds.description.instanceName] = std::move(ds); diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp index 995cfff50c5f8d22264412b2a9563ed11901551a..f4b419b4ba44f79de6809b76ccc8361232ae1eff 100644 --- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp +++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp @@ -39,7 +39,7 @@ namespace armarx { return; } - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; resetCount = 0; getResettigLabel().setText("Resetting... " + QString::number(resetCount)); getStackedWidget().setCurrentIndex(0); @@ -54,14 +54,14 @@ namespace armarx { isResetting = true; gotResetData = false; - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; robotUnit = ru; QMetaObject::invokeMethod(this, "doReset", Qt::QueuedConnection); } void RobotUnitWidgetBase::doReset() { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; clearAll(); getTreeWidget().clear(); addFilter(); diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h index 7a6a122a0844a67a74b40275b19269cb769172ba..09ab24e9ed7c1a0bbe5b7476d3898b0d4e49901c 100644 --- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h +++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h @@ -75,7 +75,7 @@ namespace armarx void timerEvent(QTimerEvent*) override; RobotUnitInterfacePrx robotUnit; - mutable std::recursive_mutex mutex; + mutable std::recursive_timed_mutex mutex; std::atomic_bool gotResetData {false}; int resetTimerId {0}; int resetCount {0}; diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp index a6ff6b745f836627ed69acde04d2dbb7f14293f4..87ed1e20e1b65e7df4e9c35c7da41c5383aa93c4 100644 --- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp +++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp @@ -54,7 +54,11 @@ namespace armarx void SensorDevicesWidget::sensorDeviceStatusChanged(const SensorDeviceStatus& status) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex, std::defer_lock}; + if (!guard.try_lock_for(std::chrono::microseconds(100))) + { + return; + } if (statusUpdates[status.deviceName].timestampUSec < status.timestampUSec) { statusUpdates[status.deviceName] = status; @@ -86,7 +90,7 @@ namespace armarx { auto temp = robotUnit->getSensorDeviceDescriptions(); { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; resetData = std::move(temp); } } @@ -104,7 +108,7 @@ namespace armarx void SensorDevicesWidget::add(const SensorDeviceDescription& desc) { - std::lock_guard<std::recursive_mutex> guard {mutex}; + std::unique_lock<std::recursive_timed_mutex> guard {mutex}; if (!entries.count(desc.deviceName)) { entries[desc.deviceName] = new SensorDevicesWidgetEntry(*this, *(ui->treeWidget), desc);