From 246e334927a58ceab4250063116a4d076720d926 Mon Sep 17 00:00:00 2001 From: gscalamera <graziano.scalamera@elettra.eu> Date: Mon, 22 Apr 2024 16:21:50 +0200 Subject: [PATCH] Fix for removal of last element --- src/AlarmHandler.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp index d1ac602..1add621 100644 --- a/src/AlarmHandler.cpp +++ b/src/AlarmHandler.cpp @@ -5968,8 +5968,13 @@ void AlarmHandler::put_signal_property() } } + // Identify the alarms that need to be removed. + // The alarms that have been identified to be removed have their tag + // stored in a std::vector. The vector is later iterated over in a second + // step when the alarms get removed. savedlock->readerIn(); map<string, string>::iterator it2=saved_alarms.begin(); + vector< string > alarms_to_be_erased; while(it2 != saved_alarms.end()) { if(!it2->first.empty())//TODO: should not be needed, bug if it happens @@ -5977,25 +5982,30 @@ void AlarmHandler::put_signal_property() auto found = local_alarms.find(it2->first); if (found == local_alarms.end()) { - DEBUG_STREAM << __func__<<": DELETING '" << it2->first << "' saved_alarms.size=" << saved_alarms.size() << endl; - DECLARE_TIME_VAR t0, t1; - GET_TIME(t0); - alarms.delete_alarm_conf_db(it2->first); - GET_TIME(t1); - DEBUG_STREAM << __func__ << ": DELETED '" <<it2->first << "' in " << ELAPSED(t0, t1) << " ms saved_alarms.size=" << saved_alarms.size() << endl; - savedlock->readerOut(); - savedlock->writerIn(); - saved_alarms.erase(it2); - savedlock->writerOut(); - savedlock->readerIn(); + alarms_to_be_erased.push_back(it2->first); } } if(it2 != saved_alarms.end()) it2++; } savedlock->readerOut(); - + // Now remove the alarms from the property in the TangoDB and saved_alarms. + if(!alarms_to_be_erased.empty()) + { + savedlock->writerIn(); + for(auto iter{alarms_to_be_erased.begin()}; iter != alarms_to_be_erased.end(); ++iter) + { + DEBUG_STREAM << __func__<<": DELETING '" << *iter << "' saved_alarms.size=" << saved_alarms.size() << endl; + DECLARE_TIME_VAR t0, t1; + GET_TIME(t0); + alarms.delete_alarm_conf_db(*iter); + GET_TIME(t1); + DEBUG_STREAM << __func__ << ": DELETED '" << *iter << "' in " << ELAPSED(t0, t1) << " ms saved_alarms.size=" << saved_alarms.size() << endl; + saved_alarms.erase(saved_alarms.find(*iter)); + } + savedlock->writerOut(); + } Tango::DbData data; data.push_back(Tango::DbDatum("AlarmList")); -- GitLab