diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp index 044ad83254787b02072039d94362635f2d58efb0..0c9076958f0ab836a81edfde8ce1494409206223 100644 --- a/src/AlarmHandler.cpp +++ b/src/AlarmHandler.cpp @@ -317,7 +317,7 @@ void AlarmHandler::delete_device() instanceCounter--; //Tango::leavefunc(); - + delete prepare_alm_mtx; /*----- PROTECTED REGION END -----*/ // AlarmHandler::delete_device delete[] attr_audibleAlarm_read; delete[] attr_StatisticsResetTime_read; @@ -351,6 +351,7 @@ void AlarmHandler::init_device() int dbPortint=0; abortflag = false; instanceCounter++; + prepare_alm_mtx = new omni_mutex(); events = new event_table(this); thread = new SubscribeThread(this); //because of static map<string, unsigned int> grp_str and of exception while subscribing @@ -366,15 +367,6 @@ void AlarmHandler::init_device() dslock = new(ReadersWritersLock); alarms.set_dev(this); - normalAlarms_read.reserve(MAX_ALARMS); - unacknowledgedAlarms_read.reserve(MAX_ALARMS); - acknowledgedAlarms_read.reserve(MAX_ALARMS); - unacknowledgedNormalAlarms_read.reserve(MAX_ALARMS); - shelvedAlarms_read.reserve(MAX_ALARMS); - outOfServiceAlarms_read.reserve(MAX_ALARMS); - silencedAlarms_read.reserve(MAX_ALARMS); - listAlarms_read.reserve(MAX_ALARMS); - /*----- PROTECTED REGION END -----*/ // AlarmHandler::init_device_before @@ -394,7 +386,17 @@ void AlarmHandler::init_device() attr_frequencyAlarms_read = new Tango::DevDouble[10000]; attr_alarmSummary_read = new Tango::DevString[10000]; /*----- PROTECTED REGION ID(AlarmHandler::init_device) ENABLED START -----*/ - +/* for(size_t i=0; i<MAX_ALARMS; i++) + { + normalAlarms_read[i].resize(MAX_ATTR_NAME); + unacknowledgedAlarms_read[i].resize(MAX_ATTR_NAME); + acknowledgedAlarms_read[i].resize(MAX_ATTR_NAME); + unacknowledgedNormalAlarms_read[i].resize(MAX_ATTR_NAME); + shelvedAlarms_read[i].resize(MAX_ATTR_NAME); + outOfServiceAlarms_read[i].resize(MAX_ATTR_NAME); + silencedAlarms_read[i].resize(MAX_ATTR_NAME); + alarmSummary_read[i].resize(MAX_ATTR_SUMMARY); + }*/ // Initialize device thread->period = subscribeRetryPeriod; @@ -675,6 +677,7 @@ void AlarmHandler::init_device() } alarms.startup_complete = gettime(); //enable actions execution in 10 seconds + thread->start(); //TODO:ecb.init(&evlist); for(map<string, vector<string> >::iterator al_ev_it=alarm_event.begin(); \ @@ -686,14 +689,14 @@ void AlarmHandler::init_device() #if 1 try { add_event(i->second, al_ev_it->second);//moved after events->add - if(i->second.to_be_evaluated) + /*if(i->second.to_be_evaluated) //moved after thread->start(); (subscribe thread started) { bei_t e; e.ev_name = ALARM_THREAD_TO_BE_EVAL; e.value.push_back(ALARM_THREAD_TO_BE_EVAL_VALUE); e.value.push_back(ALARM_THREAD_TO_BE_EVAL_VALUE); evlist.push_back(e); - } + }*/ } catch (string& err) { WARN_STREAM << "AlarmHandler::init_device(): " << err << endl; for(vector<string>::iterator j=al_ev_it->second.begin(); j!=al_ev_it->second.end(); j++) @@ -743,10 +746,27 @@ void AlarmHandler::init_device() updateloop = new update_thread(this); updateloop->start(); - thread->start(); + //thread->start(); events->start_all(); + for(map<string, vector<string> >::iterator al_ev_it=alarm_event.begin(); \ + al_ev_it!=alarm_event.end(); al_ev_it++) + { + alarm_container_t::iterator i = alarms.v_alarm.find(al_ev_it->first); + if(i != alarms.v_alarm.end()) + { + if(i->second.to_be_evaluated) //moved after thread->start(); (subscribe thread started) + { + bei_t e; + e.ev_name = ALARM_THREAD_TO_BE_EVAL; + e.value.push_back(ALARM_THREAD_TO_BE_EVAL_VALUE); + e.value.push_back(ALARM_THREAD_TO_BE_EVAL_VALUE); + evlist.push_back(e); + } + } + } + set_state(Tango::RUNNING); set_status("Alarm server is running"); @@ -3631,9 +3651,9 @@ void AlarmHandler::do_alarm(bei_t& e) j++; } - prepare_alarm_attr(); if(num_changed==0) return; + prepare_alarm_attr();//TODO: frequencyAlarm should be updated anyway if(ds_num == 0) { //attr.set_value_date_quality(ds,0/*gettime()*/,Tango::ATTR_WARNING, ds_num, 0, false); @@ -3656,7 +3676,7 @@ void AlarmHandler::do_alarm(bei_t& e) push_change_event("listAlarms",&attr_listAlarms_read[0], listAlarms_sz); push_change_event("frequencyAlarms",&attr_frequencyAlarms_read[0], listAlarms_sz); push_change_event("audibleAlarm",attr_audibleAlarm_read); - push_change_event("alarmSummary",attr_alarmSummary_read); + push_change_event("alarmSummary",attr_alarmSummary_read, alarmSummary_sz); push_archive_event("normalAlarms",&attr_normalAlarms_read[0], normalAlarms_sz); push_archive_event("unacknowledgedAlarms",&attr_unacknowledgedAlarms_read[0], unacknowledgedAlarms_sz); push_archive_event("acknowledgedAlarms",&attr_acknowledgedAlarms_read[0], acknowledgedAlarms_sz); @@ -3667,7 +3687,7 @@ void AlarmHandler::do_alarm(bei_t& e) push_archive_event("listAlarms",&attr_listAlarms_read[0], listAlarms_sz); push_archive_event("frequencyAlarms",&attr_frequencyAlarms_read[0], listAlarms_sz); push_archive_event("audibleAlarm",attr_audibleAlarm_read); - push_archive_event("alarmSummary",attr_alarmSummary_read); + push_archive_event("alarmSummary",attr_alarmSummary_read, alarmSummary_sz); } else { @@ -3687,7 +3707,13 @@ bool AlarmHandler::do_alarm_eval(string alm_name, string ev_name, Tango::TimeVal alarm_container_t::iterator it = alarms.v_alarm.find(alm_name); if(it != alarms.v_alarm.end()) { - it->second.freq_counter++; + if(ev_name == "FORCED_EVAL" && !it->second.to_be_evaluated) + { + alarms.vlock->readerOut(); + return false; + } + if(ev_name != "FORCED_EVAL") + it->second.freq_counter++; string tmpname=it->first; try { it->second.attr_values = string(""); @@ -3784,7 +3810,9 @@ bool AlarmHandler::do_alarm_eval(string alm_name, string ev_name, Tango::TimeVal } } if(!eval_err) + { it->second.to_be_evaluated = false; + } } else { @@ -3842,9 +3870,9 @@ void AlarmHandler::timer_update() push_archive_event(it->second.attr_name, &except);*/ } - prepare_alarm_attr(); if(!changed) return; + prepare_alarm_attr();//TODO: frequencyAlarm should be updated anyway try { if(ds_num == 0) @@ -3869,7 +3897,7 @@ void AlarmHandler::timer_update() push_change_event("listAlarms",&attr_listAlarms_read[0], listAlarms_sz); push_change_event("frequencyAlarms",&attr_frequencyAlarms_read[0], listAlarms_sz); push_change_event("audibleAlarm",attr_audibleAlarm_read); - push_change_event("alarmSummary",attr_alarmSummary_read); + push_change_event("alarmSummary",attr_alarmSummary_read, alarmSummary_sz); push_archive_event("normalAlarms",&attr_normalAlarms_read[0], normalAlarms_sz); push_archive_event("unacknowledgedAlarms",&attr_unacknowledgedAlarms_read[0], unacknowledgedAlarms_sz); push_archive_event("acknowledgedAlarms",&attr_acknowledgedAlarms_read[0], acknowledgedAlarms_sz); @@ -3880,7 +3908,7 @@ void AlarmHandler::timer_update() push_archive_event("listAlarms",&attr_listAlarms_read[0], listAlarms_sz); push_archive_event("frequencyAlarms",&attr_frequencyAlarms_read[0], listAlarms_sz); push_archive_event("audibleAlarm",attr_audibleAlarm_read); - push_archive_event("alarmSummary",attr_alarmSummary_read); + push_archive_event("alarmSummary",attr_alarmSummary_read, alarmSummary_sz); } catch(Tango::DevFailed& e) { ostringstream err; @@ -4336,12 +4364,18 @@ formula_res_t AlarmHandler::eval_expression(iter_t const& i, string &attr_values { if(!it->valid) { - err << "in node nameID(" << string(i->value.begin(), i->value.end()) << ") value not valid!" << ends; + if(it->ex_desc.length() > 0) + err << "attribute '" << string(i->value.begin(), i->value.end()) << "' exception: '" << it->ex_desc << "'"; + else + err << "attribute '" << string(i->value.begin(), i->value.end()) << "' value not valid!"; throw err.str(); } else if(it->type != Tango::DEV_STRING && it->value.empty()) { - err << "in node nameID(" << string(i->value.begin(), i->value.end()) << ") value not initialized!!" << ends; + if(it->ex_desc.length() > 0) + err << "attribute '" << string(i->value.begin(), i->value.end()) << "' exception: '" << it->ex_desc << "'"; + else + err << "attribute '" << string(i->value.begin(), i->value.end()) << "' value not initialized!!"; throw err.str(); } ostringstream temp_attr_val; @@ -4530,12 +4564,16 @@ formula_res_t AlarmHandler::eval_expression(iter_t const& i, string &attr_values { if(!it->valid) { - err << "in node equality_exprID -> nameID(" << string(i2_1->value.begin(), i2_1->value.end()) << ") value not valid!" << ends; + err << "in node equality_exprID -> nameID(" << string(i2_1->value.begin(), i2_1->value.end()) << ") value not valid!"; + if(it->ex_desc.length() > 0) + err << " EX: '" << it->ex_desc << "'"; throw err.str(); } else if(it->type != Tango::DEV_STRING && it->value.empty()) { - err << "in node nameID(" << string(i2_1->value.begin(), i2_1->value.end()) << ") value not initialized!!" << ends; + err << "in node nameID(" << string(i2_1->value.begin(), i2_1->value.end()) << ") value not initialized!!"; + if(it->ex_desc.length() > 0) + err << " EX: '" << it->ex_desc << "'"; throw err.str(); } ostringstream temp_attr_val; @@ -4782,18 +4820,11 @@ void AlarmHandler::eval_node_event(iter_t const& i, vector<string> & ev) void AlarmHandler::prepare_alarm_attr() { + prepare_alm_mtx->lock(); alarm_container_t::iterator ai; vector<alarm_t>::iterator aid; bool is_audible=false; alarms.vlock->readerIn(); - outOfServiceAlarms_read.clear(); - shelvedAlarms_read.clear(); - acknowledgedAlarms_read.clear(); - unacknowledgedAlarms_read.clear(); - unacknowledgedNormalAlarms_read.clear(); - normalAlarms_read.clear(); - silencedAlarms_read.clear(); - listAlarms_read.clear(); outOfServiceAlarms_sz=0; shelvedAlarms_sz=0; acknowledgedAlarms_sz=0; @@ -4803,61 +4834,112 @@ void AlarmHandler::prepare_alarm_attr() silencedAlarms_sz=0; listAlarms_sz=0; alarmSummary_sz=0; - for (ai = alarms.v_alarm.begin(); ai != alarms.v_alarm.end(); ai++) { - ostringstream alm_summary; + for (ai = alarms.v_alarm.begin(); ai != alarms.v_alarm.end(); ai++) { +#ifndef ALM_SUM_STR + stringstream alm_summary; alm_summary << KEY(NAME_KEY) << ai->first << SEP; +#else + string alm_summary; + alm_summary += KEY(NAME_KEY) + ai->first + SEP; +#endif if(ai->second.enabled == false) { - outOfServiceAlarms_read.push_back(ai->second.name); + outOfServiceAlarms_read[outOfServiceAlarms_sz] = ai->second.name; attr_outOfServiceAlarms_read[outOfServiceAlarms_sz] = const_cast<char*>(outOfServiceAlarms_read[outOfServiceAlarms_sz].c_str()); + /*strcpy(c_outOfServiceAlarms_read[outOfServiceAlarms_sz], ai->second.name.c_str()); + attr_outOfServiceAlarms_read[outOfServiceAlarms_sz] = c_outOfServiceAlarms_read[outOfServiceAlarms_sz];*/ + //attr_outOfServiceAlarms_read[outOfServiceAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); outOfServiceAlarms_sz++; +#ifndef ALM_SUM_STR alm_summary << KEY(VALUE_KEY) << "OOSRV" << SEP; //TODO: string or enum value? +#else + alm_summary += string(KEY(VALUE_KEY)) + "OOSRV" + SEP; //TODO: string or enum value? +#endif } else if(ai->second.shelved) { - shelvedAlarms_read.push_back(ai->second.name); + shelvedAlarms_read[shelvedAlarms_sz] = ai->second.name; attr_shelvedAlarms_read[shelvedAlarms_sz] = const_cast<char*>(shelvedAlarms_read[shelvedAlarms_sz].c_str()); + /*strcpy(c_shelvedAlarms_read[shelvedAlarms_sz], ai->second.name.c_str()); + attr_shelvedAlarms_read[shelvedAlarms_sz] = c_shelvedAlarms_read[shelvedAlarms_sz];*/ + //attr_shelvedAlarms_read[shelvedAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); shelvedAlarms_sz++; +#ifndef ALM_SUM_STR alm_summary << KEY(VALUE_KEY) << "SHLVD" << SEP; //TODO: string or enum value? +#else + alm_summary += string(KEY(VALUE_KEY)) + "SHLVD" + SEP; //TODO: string or enum value? +#endif } else { if(ai->second.stat == S_ALARM && ai->second.ack == ACK) { - acknowledgedAlarms_read.push_back(ai->second.name); + acknowledgedAlarms_read[acknowledgedAlarms_sz] = ai->second.name; attr_acknowledgedAlarms_read[acknowledgedAlarms_sz] = const_cast<char*>(acknowledgedAlarms_read[acknowledgedAlarms_sz].c_str()); + /*strcpy(c_acknowledgedAlarms_read[acknowledgedAlarms_sz], ai->second.name.c_str()); + attr_acknowledgedAlarms_read[acknowledgedAlarms_sz] = c_acknowledgedAlarms_read[acknowledgedAlarms_sz];*/ + //attr_acknowledgedAlarms_read[acknowledgedAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); acknowledgedAlarms_sz++; +#ifndef ALM_SUM_STR alm_summary << KEY(VALUE_KEY) << "ACKED" << SEP; //TODO: string or enum value? +#else + alm_summary += string(KEY(VALUE_KEY)) + "ACKED" + SEP; //TODO: string or enum value? +#endif } else if(ai->second.stat == S_ALARM && ai->second.ack == NOT_ACK) { - unacknowledgedAlarms_read.push_back(ai->second.name); + unacknowledgedAlarms_read[unacknowledgedAlarms_sz] = ai->second.name; attr_unacknowledgedAlarms_read[unacknowledgedAlarms_sz] = const_cast<char*>(unacknowledgedAlarms_read[unacknowledgedAlarms_sz].c_str()); + /*strcpy(c_unacknowledgedAlarms_read[unacknowledgedAlarms_sz], ai->second.name.c_str()); + attr_unacknowledgedAlarms_read[unacknowledgedAlarms_sz] = c_unacknowledgedAlarms_read[unacknowledgedAlarms_sz];*/ + //attr_unacknowledgedAlarms_read[unacknowledgedAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); unacknowledgedAlarms_sz++; +#ifndef ALM_SUM_STR alm_summary << KEY(VALUE_KEY) << "UNACK" << SEP; //TODO: string or enum value? +#else + alm_summary += string(KEY(VALUE_KEY)) + "UNACK" + SEP; //TODO: string or enum value? +#endif } else if(ai->second.stat == S_NORMAL && ai->second.ack == NOT_ACK) { - unacknowledgedNormalAlarms_read.push_back(ai->second.name); + unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz] = ai->second.name; attr_unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz] = const_cast<char*>(unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz].c_str()); + /*strcpy(c_unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz], ai->second.name.c_str()); + attr_unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz] = c_unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz];*/ + //attr_unacknowledgedNormalAlarms_read[unacknowledgedNormalAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); unacknowledgedNormalAlarms_sz++; +#ifndef ALM_SUM_STR alm_summary << KEY(VALUE_KEY) << "RTNUN" << SEP; //TODO: string or enum value? +#else + alm_summary += string(KEY(VALUE_KEY)) + "RTNUN" + SEP; //TODO: string or enum value? +#endif } else if(ai->second.stat == S_NORMAL && ai->second.ack == ACK) { - normalAlarms_read.push_back(ai->second.name); + normalAlarms_read[normalAlarms_sz] = ai->second.name; attr_normalAlarms_read[normalAlarms_sz] = const_cast<char*>(normalAlarms_read[normalAlarms_sz].c_str()); + /*strcpy(c_normalAlarms_read[normalAlarms_sz], ai->second.name.c_str()); + attr_normalAlarms_read[normalAlarms_sz] = c_normalAlarms_read[normalAlarms_sz];*/ + //attr_normalAlarms_read[normalAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); normalAlarms_sz++; +#ifndef ALM_SUM_STR alm_summary << KEY(VALUE_KEY) << "NORM" << SEP; //TODO: string or enum value? +#else + alm_summary += string(KEY(VALUE_KEY)) + "NORM" + SEP; //TODO: string or enum value? +#endif } if(ai->second.silenced > 0) { - silencedAlarms_read.push_back(ai->second.name); + silencedAlarms_read[silencedAlarms_sz] = ai->second.name; attr_silencedAlarms_read[silencedAlarms_sz] = const_cast<char*>(silencedAlarms_read[silencedAlarms_sz].c_str()); + /*strcpy(c_silencedAlarms_read[silencedAlarms_sz], ai->second.name.c_str()); + attr_silencedAlarms_read[silencedAlarms_sz] = c_silencedAlarms_read[silencedAlarms_sz];*/ + //attr_silencedAlarms_read[silencedAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); silencedAlarms_sz++; } } +#ifndef ALM_SUM_STR alm_summary << KEY(ALARM_TIME_KEY) << ai->second.ts.tv_sec << "." << ai->second.ts.tv_usec << SEP; alm_summary << KEY(MESSAGE_KEY) << ai->second.msg << SEP; //TODO: escape ';' alm_summary << KEY(ACKNOWLEDGED_KEY) << (ai->second.ack== ACK ? 1 : 0) << SEP; //TODO: 1/0 or ACK, NOT_ACK ? @@ -4869,22 +4951,65 @@ void AlarmHandler::prepare_alarm_attr() alm_summary << KEY(OFF_COUNTER_KEY) << ai->second.off_counter << SEP; alm_summary << KEY(FREQ_COUNTER_KEY) << ai->second.freq_counter << SEP; alm_summary << KEY(QUALITY_KEY) << ai->second.quality << SEP; +#else + stringstream sval; + sval << ai->second.ts.tv_sec << "." << ai->second.ts.tv_usec; + alm_summary += KEY(ALARM_TIME_KEY) + sval.str() + SEP; + alm_summary += KEY(MESSAGE_KEY) + ai->second.msg + SEP; //TODO: escape ';' + alm_summary += string(KEY(ACKNOWLEDGED_KEY)) + (ai->second.ack== ACK ? "1" : "0") + SEP; //TODO: 1/0 or ACK, NOT_ACK ? + alm_summary += string(KEY(ENABLED_KEY)) + (ai->second.enabled ? "1" : "0") + SEP; + alm_summary += string(KEY(SHELVED_KEY)) + (ai->second.shelved ? "1" : "0") + SEP; + alm_summary += KEY(LEVEL_KEY) + ai->second.lev + SEP; + alm_summary += KEY(GROUP_KEY) + ai->second.grp2str() + SEP; + sval.str(""); + sval << ai->second.on_counter; + alm_summary += KEY(ON_COUNTER_KEY) + sval.str() + SEP; + sval.str(""); + sval << ai->second.off_counter; + alm_summary += KEY(OFF_COUNTER_KEY) + sval.str() + SEP; + sval.str(""); + sval << ai->second.freq_counter; + alm_summary += KEY(FREQ_COUNTER_KEY) + sval.str() + SEP; + sval.str(""); + sval << ai->second.quality; + alm_summary += KEY(QUALITY_KEY) + sval.str() + SEP; +#endif ostringstream tmp_ex; - tmp_ex.str(""); + //tmp_ex.str(""); if(ai->second.ex_reason.length() > 0 || ai->second.ex_desc.length() > 0 || ai->second.ex_origin.length() > 0) + { tmp_ex << "Reason: '" << ai->second.ex_reason << "' Desc: '" << ai->second.ex_desc << "' Origin: '" << ai->second.ex_origin << "'"; + DEBUG_STREAM << __func__ << ": " << tmp_ex.str(); + } +#ifndef ALM_SUM_STR alm_summary << KEY(EXCEPTION_KEY) << tmp_ex.str() << SEP; +#else + alm_summary += KEY(EXCEPTION_KEY) + tmp_ex.str() + SEP; +#endif +#ifndef ALM_SUM_STR alm_summary << KEY(SILENT_TIME_REMAINING_KEY) << ai->second.silenced << SEP; +#else + sval.str(""); + sval << ai->second.silenced; + alm_summary += KEY(SILENT_TIME_REMAINING_KEY) + sval.str() + SEP; +#endif attr_frequencyAlarms_read[listAlarms_sz] = ai->second.freq_counter; - listAlarms_read.push_back(ai->second.name); + listAlarms_read[listAlarms_sz] = ai->second.name; attr_listAlarms_read[listAlarms_sz] = const_cast<char*>(listAlarms_read[listAlarms_sz].c_str()); + /*strcpy(c_listAlarms_read[listAlarms_sz], ai->second.name.c_str()); + attr_listAlarms_read[listAlarms_sz] = c_listAlarms_read[listAlarms_sz];*/ + //attr_listAlarms_read[listAlarms_sz] = CORBA::string_dup(ai->second.name.c_str()); listAlarms_sz++; if(!is_audible && ai->second.is_new && ai->second.silenced <= 0 && ai->second.enabled && !ai->second.shelved) is_audible = true; +#ifndef ALM_SUM_STR alm_summary << KEY(AUDIBLE_KEY) << (is_audible ? 1 : 0) << SEP; alm_summary << KEY(ATTR_VALUES_KEY) << ai->second.attr_values << SEP; - +#else + alm_summary += string(KEY(AUDIBLE_KEY)) + (is_audible ? "1" : "0") + SEP; + alm_summary += KEY(ATTR_VALUES_KEY) + ai->second.attr_values + SEP; +#endif if (ai->second.stat == S_ALARM && ai->second.enabled && !ai->second.shelved) { /* * alarm status is S_ALARM @@ -4970,13 +5095,21 @@ void AlarmHandler::prepare_alarm_attr() } /* if */ alarmedlock->readerOut(); } /* if else if */ +#ifndef ALM_SUM_STR alarmSummary_read[alarmSummary_sz] = alm_summary.str(); +#else + alarmSummary_read[alarmSummary_sz] = alm_summary; +#endif attr_alarmSummary_read[alarmSummary_sz] = const_cast<char*>(alarmSummary_read[alarmSummary_sz].c_str()); + /*strncpy(c_alarmSummary_read[alarmSummary_sz], alm_summary.c_str(), MAX_SUMMARY-1); + c_alarmSummary_read[alarmSummary_sz][MAX_SUMMARY-1]=0; + attr_alarmSummary_read[alarmSummary_sz] = c_alarmSummary_read[alarmSummary_sz];*/ + //attr_alarmSummary_read[alarmSummary_sz] = CORBA::string_dup(alm_summary.c_str()); alarmSummary_sz++; } /* for */ *attr_audibleAlarm_read = is_audible; alarms.vlock->readerOut(); - + prepare_alm_mtx->unlock(); vector<string> tmp_alarm_table; string is_new; ostringstream os1; diff --git a/src/AlarmHandler.h b/src/AlarmHandler.h index 7363de3438b4025c3a2c745019412d4899204789..3f87222499983e3e424520fff1348960b4f66d08 100644 --- a/src/AlarmHandler.h +++ b/src/AlarmHandler.h @@ -45,7 +45,9 @@ #include "event_table.h" #include "SubscribeThread.h" -#define MAX_ALARMS 10000 +#define MAX_ALARMS 2000 +#define MAX_ATTR_NAME 1000 +#define MAX_ATTR_SUMMARY 10000 //#define _USE_ELETTRA_DB_RW @@ -104,15 +106,26 @@ public: Tango::DevLong attr_AttributeStoppedNumber_read; Tango::DevLong attr_AttributeNumber_read; - vector<string> normalAlarms_read; - vector<string> unacknowledgedAlarms_read; - vector<string> acknowledgedAlarms_read; - vector<string> unacknowledgedNormalAlarms_read; - vector<string> shelvedAlarms_read; - vector<string> outOfServiceAlarms_read; - vector<string> silencedAlarms_read; - vector<string> listAlarms_read; - string alarmSummary_read[10000]; + string normalAlarms_read[MAX_ALARMS]; + string unacknowledgedAlarms_read[MAX_ALARMS]; + string acknowledgedAlarms_read[MAX_ALARMS]; + string unacknowledgedNormalAlarms_read[MAX_ALARMS]; + string shelvedAlarms_read[MAX_ALARMS]; + string outOfServiceAlarms_read[MAX_ALARMS]; + string silencedAlarms_read[MAX_ALARMS]; + string listAlarms_read[MAX_ALARMS]; + string alarmSummary_read[MAX_ALARMS]; + +/* char c_normalAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_unacknowledgedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_acknowledgedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_unacknowledgedNormalAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_shelvedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_outOfServiceAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_silencedAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; + char c_listAlarms_read[MAX_ALARMS][MAX_ATTR_NAME]; +#define MAX_SUMMARY 2*MAX_ATTR_NAME //TODO: max summary length!!! + char c_alarmSummary_read[MAX_ALARMS][MAX_SUMMARY];*/ size_t normalAlarms_sz; size_t unacknowledgedAlarms_sz; @@ -126,6 +139,8 @@ public: double last_statistics_reset_time; + omni_mutex *prepare_alm_mtx; + /*----- PROTECTED REGION END -----*/ // AlarmHandler::Data Members // Device property data members diff --git a/src/event_table.cpp b/src/event_table.cpp index e5851a1911aaf026a7e85f218755d436df3585b6..b4792d8a86653bd51fe1f5ae5d001f5b2c798d02 100644 --- a/src/event_table.cpp +++ b/src/event_table.cpp @@ -124,6 +124,16 @@ list<bei_t> event_list::show(void) return(el); } +size_t event_list::size(void) +{ + size_t res; + + this->lock(); + res = l_event.size(); + this->unlock(); + return(res); +} + /* * event class methods diff --git a/src/event_table.h b/src/event_table.h index 8e6f95eee567e030ce635babdc97ca6957023b10..576f2fe491ddff8c25857c1ab6c50b35d458aea8 100644 --- a/src/event_table.h +++ b/src/event_table.h @@ -126,6 +126,7 @@ class event_list : public omni_mutex { const bei_t pop_front(void); void clear(void); list<bei_t> show(void); + size_t size(); protected: list<bei_t> l_event; private: