From 878b32ba441bf8e56f52dd6bacd49399ef213324 Mon Sep 17 00:00:00 2001 From: gscalamera <graziano.scalamera@elettra.eu> Date: Thu, 27 Apr 2017 13:40:06 +0200 Subject: [PATCH] Fixed init/restart --- src/AlarmHandler.cpp | 46 +++++++++++++++++++++++++++++--------------- src/AlarmHandler.h | 2 +- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp index f514d03..d67173b 100644 --- a/src/AlarmHandler.cpp +++ b/src/AlarmHandler.cpp @@ -203,7 +203,8 @@ void AlarmHandler::delete_device() e.value.push_back(ALARM_THREAD_EXIT_VALUE); e.value.push_back(ALARM_THREAD_EXIT_VALUE); evlist.push_back(e); - //alarms.del_rwlock(); moved in alarm_table destructor + if(!shutting_down && !restarting) + alarms.del_rwlock(); //otherwise moved in alarm_table destructor alarms.stop_cmdthread(); sleep(1); //wait for alarm_thread and log_thread to exit //delete almloop; @@ -221,7 +222,7 @@ void AlarmHandler::delete_device() i->second.dp_n = NULL; } - if(restarting || shutting_down) //TODO: handle init, restart device + if(0/*shutting_down*/) //TODO: no need to remove attributes when shutting down ? { for(alarm_container_t::iterator it = alarms.v_alarm.begin(); it != alarms.v_alarm.end(); it++) { @@ -233,6 +234,8 @@ void AlarmHandler::delete_device() { INFO_STREAM << __func__<<": exception removing " << it->second.attr_name << ": " << e.errors[0].desc; } +#if _FORMULA_ATTR + CORBA::string_free(*(it->second.attr_value_formula)); try { remove_AlarmFormula_dynamic_attribute(it->second.attr_name_formula); @@ -241,6 +244,7 @@ void AlarmHandler::delete_device() { INFO_STREAM << __func__<<": exception removing " << it->second.attr_name_formula << ": " << e.errors[0].desc; } +#endif } } /* @@ -297,6 +301,7 @@ void AlarmHandler::delete_device() delete dslock; delete events; DEBUG_STREAM << "AlarmHandler::delete_device(): saved AlarmStatus in properties!!" << endl; + instanceCounter--; //Tango::leavefunc(); /*----- PROTECTED REGION END -----*/ // AlarmHandler::delete_device @@ -494,7 +499,7 @@ void AlarmHandler::init_device() temp_evn.clear(); try { load_alarm(*it_al, tmp_alm, temp_evn); - add_alarm(tmp_alm); + add_alarm(tmp_alm,/*starting*/true); tmp_alm_name_lst.push_back(tmp_alm.name); } catch(Tango::DevFailed& e) { @@ -1333,10 +1338,12 @@ void AlarmHandler::add_dynamic_attributes() Tango::DevEnum *attr_value = get_AlarmState_data_ptr(i->second.attr_name); i->second.attr_value = attr_value; i->second.attr_name_formula = i->second.attr_name + string("Formula"); +#if _FORMULA_ATTR add_AlarmFormula_dynamic_attribute(i->second.attr_name_formula); Tango::DevString *attr_value_formula = get_AlarmFormula_data_ptr(i->second.attr_name_formula); - *attr_value_formula = CORBA::string_dup(i->second.formula.c_str()); + *attr_value_formula = Tango::string_dup(i->second.formula.c_str()); i->second.attr_value_formula = attr_value_formula; +#endif } } alarms.vlock->readerOut(); @@ -3070,22 +3077,26 @@ void AlarmHandler::init_events(vector<string> &evn) } } /* if */ } -void AlarmHandler::add_alarm(alarm_t& a) throw(string&) +void AlarmHandler::add_alarm(alarm_t& a, bool starting) throw(string&) { alarms.push_back(a); DEBUG_STREAM << "AlarmHandler::add_alarm(): added alarm '" \ << a.name << "'" << endl; - - alarm_container_t::iterator italm = alarms.v_alarm.find(a.name); - add_AlarmState_dynamic_attribute(italm->second.attr_name); - Tango::DevEnum *attr_value = get_AlarmState_data_ptr(italm->second.attr_name); - italm->second.attr_value = attr_value; - - italm->second.attr_name_formula = italm->second.attr_name + string("Formula"); - add_AlarmFormula_dynamic_attribute(italm->second.attr_name_formula); - Tango::DevString *attr_value_formula = get_AlarmFormula_data_ptr(italm->second.attr_name_formula); - *attr_value_formula = CORBA::string_dup(italm->second.formula.c_str()); - italm->second.attr_value_formula = attr_value_formula; + if(!starting) + { + alarm_container_t::iterator italm = alarms.v_alarm.find(a.name); + add_AlarmState_dynamic_attribute(italm->second.attr_name); + Tango::DevEnum *attr_value = get_AlarmState_data_ptr(italm->second.attr_name); + italm->second.attr_value = attr_value; + + italm->second.attr_name_formula = italm->second.attr_name + string("Formula"); +#if _FORMULA_ATTR + add_AlarmFormula_dynamic_attribute(italm->second.attr_name_formula); + Tango::DevString *attr_value_formula = get_AlarmFormula_data_ptr(italm->second.attr_name_formula); + *attr_value_formula = Tango::string_dup(italm->second.formula.c_str()); + italm->second.attr_value_formula = attr_value_formula; +#endif + } } void AlarmHandler::add_event(alarm_t& a, vector<string> &evn) throw(string&) @@ -3713,6 +3724,8 @@ bool AlarmHandler::remove_alarm(string& s) throw(string&) o << "AlarmHandler::" << __func__<<": attname '" << i->second.attr_name << "' exception removing attribute err="<<e.errors[0].desc ; INFO_STREAM << o.str() << endl; } +#if _FORMULA_ATTR + CORBA::string_free(*(i->second.attr_value_formula)); try { remove_AlarmFormula_dynamic_attribute(i->second.attr_name_formula); @@ -3723,6 +3736,7 @@ bool AlarmHandler::remove_alarm(string& s) throw(string&) o << "AlarmHandler::" << __func__<<": attname '" << i->second.attr_name_formula << "' exception removing attribute err="<<e.errors[0].desc ; INFO_STREAM << o.str() << endl; } +#endif /* * remove this alarm from alarm table */ diff --git a/src/AlarmHandler.h b/src/AlarmHandler.h index 759cc14..d1c7870 100644 --- a/src/AlarmHandler.h +++ b/src/AlarmHandler.h @@ -497,7 +497,7 @@ private: #if 0 void init_alarms(map< string,vector<string> > &alarm_events); #endif - void add_alarm(alarm_t& a) throw(string&); + void add_alarm(alarm_t& a, bool starting=false) throw(string&); void add_event(alarm_t& a, vector<string> &evn) throw(string&); #if 0 void subscribe_event(alarm_t& a, EventCallBack& ecb, vector<string> &evn) throw(string&); -- GitLab