diff --git a/src/Alarm.cpp b/src/Alarm.cpp index 7d985c89ce028c7835b57f5eff14165ee4ba87f6..26759e10a0ec1eb75e13c78814a6ad7087f885b8 100644 --- a/src/Alarm.cpp +++ b/src/Alarm.cpp @@ -190,7 +190,11 @@ void Alarm::delete_device() /* * unsubscribe events and release memory */ - DEBUG_STREAM << "Alarm::delete_device(): entering..." << endl; + bool starting = Tango::Util::instance()->is_svr_starting(); + bool shutting_down = Tango::Util::instance()->is_svr_shutting_down(); + bool restarting = Tango::Util::instance()->is_device_restarting(device_name); + DEBUG_STREAM << __func__ << " starting="<<(int)starting << " shutting_down="<<(int)shutting_down<<" restarting="<<(int)restarting; + abortflag = true; DEBUG_STREAM << "Alarm::delete_device(): after abortflag=true..." << endl; try { @@ -226,6 +230,29 @@ void Alarm::delete_device() delete i->second.dp_n; i->second.dp_n = NULL; } + + if(restarting || shutting_down) //TODO: handle init, restart device + { + for(alarm_container_t::iterator it = alarms.v_alarm.begin(); it != alarms.v_alarm.end(); it++) + { + try + { + remove_AlarmState_dynamic_attribute_no_clean_db(it->second.attr_name); + } + catch(Tango::DevFailed &e) + { + INFO_STREAM << __func__<<": exception removing " << it->second.attr_name << ": " << e.errors[0].desc; + } + try + { + remove_AlarmFormula_dynamic_attribute(it->second.attr_name_formula); + } + catch(Tango::DevFailed &e) + { + INFO_STREAM << __func__<<": exception removing " << it->second.attr_name_formula << ": " << e.errors[0].desc; + } + } + } /* * clear all data structures */ @@ -1568,6 +1595,19 @@ void Alarm::load(Tango::DevString argin) (const char*)err.c_str(), \ (const char*)"Alarm::load()", Tango::ERR); } +#if 0 + try + { + Tango::Attribute attr = this->get_device_attr()->get_attr_by_name(alm.attr_name.c_str()); + push_att_conf_event(&attr); + } + catch(Tango::DevFailed &e) + { + ostringstream o; + o << "Alarm::" << __func__<<": alarm '" << alm.name << "' cannot push att_conf event, err="<<e.errors[0].desc ; + INFO_STREAM << o.str() << endl; + } +#endif #if 0 try { add_event(alm, evn); @@ -3150,14 +3190,6 @@ void Alarm::load_alarm(string alarm_string, alarm_t &alm, vector<string> &evn) (const char*)"", \ (const char*)"Alarm::load_alarm()", Tango::ERR); } - add_AlarmState_dynamic_attribute(alm.attr_name); - Tango::DevEnum *attr_value = get_AlarmState_data_ptr(alm.attr_name); - alm.attr_value = attr_value; - alm.attr_name_formula = alm.attr_name + string("Formula"); - add_AlarmFormula_dynamic_attribute(alm.attr_name_formula); - Tango::DevString *attr_value_formula = get_AlarmFormula_data_ptr(alm.attr_name_formula); - *attr_value_formula = CORBA::string_dup(alm.formula.c_str()); - alm.attr_value_formula = attr_value_formula; if (alarms.exist(alm.name)) { ostringstream o; o << "Alarm::load_alarm(): alarm '" << alm.name << "' already exist" << ends; @@ -3231,6 +3263,18 @@ void Alarm::add_alarm(alarm_t& a) throw(string&) alarms.push_back(a); DEBUG_STREAM << "Alarm::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; + } void Alarm::add_event(alarm_t& a, vector<string> &evn) throw(string&) { @@ -3890,11 +3934,30 @@ bool Alarm::remove_alarm(string& s) throw(string&) i->second.dp_a = NULL; if(i->second.dp_n) delete i->second.dp_n; - i->second.dp_n = NULL; + i->second.dp_n = NULL; + try + { + remove_AlarmState_dynamic_attribute(i->second.attr_name); + } + catch(Tango::DevFailed &e) + { + ostringstream o; + o << "Alarm::" << __func__<<": attname '" << i->second.attr_name << "' exception removing attribute err="<<e.errors[0].desc ; + INFO_STREAM << o.str() << endl; + } + try + { + remove_AlarmFormula_dynamic_attribute(i->second.attr_name_formula); + } + catch(Tango::DevFailed &e) + { + ostringstream o; + o << "Alarm::" << __func__<<": attname '" << i->second.attr_name_formula << "' exception removing attribute err="<<e.errors[0].desc ; + INFO_STREAM << o.str() << endl; + } /* * remove this alarm from alarm table */ - remove_AlarmState_dynamic_attribute(i->second.attr_name); alarms.erase(i); #ifndef _RW_LOCK alarms.unlock(); @@ -5045,6 +5108,23 @@ void Alarm::put_signal_property() } delete db; } +//-------------------------------------------------------- +/** + * remove a AlarmState dynamic attribute without cleaning DB. + * + * parameter attname: attribute name to be removed. + */ +//-------------------------------------------------------- +void Alarm::remove_AlarmState_dynamic_attribute_no_clean_db(string attname) +{ + remove_attribute(attname, true, false); + map<string,Tango::DevEnum>::iterator ite; + if ((ite=AlarmState_data.find(attname))!=AlarmState_data.end()) + { + DEBUG_STREAM << __func__<<": entering name="<<attname; + AlarmState_data.erase(ite); + } +} /*----- PROTECTED REGION END -----*/ // Alarm::namespace_ending diff --git a/src/Alarm.h b/src/Alarm.h index 931cb892b81da89cd9bd5db5cfbdfff67d751bac..ccd4f0d06c56a087b8366bf7b997c5d6fcb50d5c 100644 --- a/src/Alarm.h +++ b/src/Alarm.h @@ -522,6 +522,8 @@ private: void prepare_alarm_attr(); //for read attribute alarm and push_change_event + void remove_AlarmState_dynamic_attribute_no_clean_db(string attname); + SubscribeThread *thread; public: diff --git a/src/AlarmDynAttrUtils.cpp b/src/AlarmDynAttrUtils.cpp index 4a9991b300ea469d9438529fb23f3138d246961c..87084ee7c304308b4494b92f10967d71fa51a029 100644 --- a/src/AlarmDynAttrUtils.cpp +++ b/src/AlarmDynAttrUtils.cpp @@ -93,6 +93,15 @@ void Alarm::add_AlarmState_dynamic_attribute(string attname) /*----- PROTECTED REGION ID(Alarm::att_AlarmState_dynamic_attribute) ENABLED START -----*/ DEBUG_STREAM << __func__<<": entering name="<<attname; + alarm_container_t::iterator i = alarms.v_alarm.find(attname); + if(i != alarms.v_alarm.end()) + { + alarmstate_prop.set_description(i->second.formula.c_str()); + } + else + { + INFO_STREAM << __func__<<": name="<<attname<<" NOT FOUND while looking for formula to add as attribute description"; + } /*----- PROTECTED REGION END -----*/ // Alarm::att_AlarmState_dynamic_attribute {