Skip to content
Snippets Groups Projects
Commit 85d585ae authored by Graziano Scalamera's avatar Graziano Scalamera
Browse files

forced first evaluation of formulas also if attributes already

subscribed
parent ea99c75f
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
......@@ -301,11 +301,12 @@ friend class alarm_thread;
friend class SubscribeThread;
friend class event_table;
alarm_table alarms;
protected :
private:
vector<alarm_t> stored; /* property stored alarms (on exit) */
alarm_table alarms;
event_table* events;
// event_list evlist; /* producer/consumer events list */ //gcc 4 problem??
// EventCallBack ecb; /* callback handles */
......@@ -354,6 +355,7 @@ private:
public:
void put_signal_property();
void do_alarm(bei_t& e); //public instead of protected for gcc 4 problem??
bool do_alarm_eval(string alm_name, string ev_name, Tango::TimeVal ts);
void timer_update(); //public instead of protected for gcc 4 problem??
event_list evlist; /* producer/consumer events list */ //public instead of protected for gcc 4 problem??
bool abortflag;
......
......@@ -52,18 +52,69 @@ alarm_thread::~alarm_thread()
*/
void alarm_thread::run(void *)
{
size_t to_be_evaluated = 0;
//int period = 5; //seconds
int awaken = 0;
vector<string> alm_to_be_eval;
while (true) {
/*
* pop_front() will wait() on condition variable
*/
try
{
bei_t e = p_Alarm->evlist.pop_front();
//DEBUG_STREAM << "alarm_thread::run(): woken up!!!! " << e.name << endl;
if ((e.ev_name == ALARM_THREAD_EXIT) && \
(e.value[0] == ALARM_THREAD_EXIT_VALUE))
break;
p_Alarm->do_alarm(e);
if(to_be_evaluated > 0)
{
bool changed = true;
int num_changed = 0;
if(alm_to_be_eval.size() > 0)
{
for(vector<string>::iterator i = alm_to_be_eval.begin(); i != alm_to_be_eval.end(); i++)
{
changed = p_Alarm->do_alarm_eval(*i, "FORCED_EVAL", gettime());
if(changed)
num_changed++;
}
#if 0 //TODO
prepare_alarm_attr();
if(num_changed==0)
return;
if(ds_num == 0)
{
//attr.set_value_date_quality(ds,0/*gettime()*/,Tango::ATTR_WARNING, ds_num, 0, false);
struct timeval now;
gettimeofday(&now,NULL);
push_change_event("alarm",(char**)ds,now,Tango::ATTR_WARNING, ds_num, 0, false);
}
else
//attr.set_value(ds, ds_num, 0, false);
push_change_event("alarm",ds, ds_num, 0, false);
#endif
}
#if 0
alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
to_be_evaluated = alm_to_be_eval.size();
#else
to_be_evaluated = 0;
#endif
}
bei_t e;
{
e = p_Alarm->evlist.pop_front();
//DEBUG_STREAM << "alarm_thread::run(): woken up!!!! " << e.name << endl;
if ((e.ev_name == ALARM_THREAD_EXIT) && \
(e.value[0] == ALARM_THREAD_EXIT_VALUE))
{
break;
}
else if ((e.ev_name == ALARM_THREAD_TO_BE_EVAL) && \
(e.value[0] == ALARM_THREAD_TO_BE_EVAL_VALUE))
{
alm_to_be_eval = p_Alarm->alarms.to_be_evaluated_list();
to_be_evaluated = alm_to_be_eval.size();
continue;
}
p_Alarm->do_alarm(e);
}
}
catch(omni_thread_fatal& ex)
{
......
......@@ -25,11 +25,14 @@
#define ALARM_THREAD_EXIT "alarm_thread_exit"
#define ALARM_THREAD_EXIT_VALUE -100
#define ALARM_THREAD_TO_BE_EVAL "to_be_evaluated"
#define ALARM_THREAD_TO_BE_EVAL_VALUE -200
class alarm_thread : public omni_thread {
public:
alarm_thread(Alarm_ns::Alarm *p);
~alarm_thread();
//int period;
protected:
void run(void *);
private:
......
......@@ -679,6 +679,50 @@ bool alarm_table::exist(string& s)
return false;
}
unsigned int alarm_table::to_be_evaluated_num()
{
unsigned int ret=0;
#ifndef _RW_LOCK
this->lock();
#else
vlock->readerIn();
#endif
for(alarm_container_t::iterator i = v_alarm.begin(); i != v_alarm.end(); i++)
{
if(i->second.to_be_evaluated == true)
ret++;
}
#ifndef _RW_LOCK
this->unlock();
#else
vlock->readerOut();
#endif
return ret;
}
vector<string> alarm_table::to_be_evaluated_list()
{
vector<string> ret;
#ifndef _RW_LOCK
this->lock();
#else
vlock->readerIn();
#endif
for(alarm_container_t::iterator i = v_alarm.begin(); i != v_alarm.end(); i++)
{
if(i->second.to_be_evaluated == true)
ret.push_back(i->first);
}
#ifndef _RW_LOCK
this->unlock();
#else
vlock->readerOut();
#endif
return ret;
}
#ifdef _RW_LOCK
void alarm_table::new_rwlock()
{
......
......@@ -350,6 +350,8 @@ class alarm_table {
bool timer_update();
void erase(alarm_container_t::iterator i);
bool exist(string& s);
unsigned int to_be_evaluated_num();
vector<string> to_be_evaluated_list();
//vector<alarm_t> v_alarm;
alarm_container_t v_alarm;
#ifdef _RW_LOCK
......
......@@ -176,12 +176,10 @@ event::event(string& s) : name(s)
void event::push_alarm(string& n)
{
m_alarm.push_back(n);
cout << "event::"<<__func__<< ": event="<<name<<" alm="<< n << " size="<< m_alarm.size() << endl;
}
void event::pop_alarm(string& n)
{
cout << "event::"<<__func__<< ": event="<<name<<" alm="<< n << " size="<< m_alarm.size() << endl;
vector<string>::iterator it = find(m_alarm.begin(), m_alarm.end(), n);
if(it != m_alarm.end())
m_alarm.erase(it);
......@@ -685,6 +683,7 @@ void event_table::unsubscribe_events()
//=============================================================================
void event_table::add(string &signame, vector<string> contexts)
{
DEBUG_STREAM << "event_table::"<<__func__<< " entering signame=" << signame << endl;
add(signame, contexts, NOTHING, false);
}
//=============================================================================
......@@ -770,18 +769,7 @@ void event_table::add(string &signame, vector<string> contexts, int to_do, bool
if(found && start)
{
try
{
Tango::AttributeInfo info;
if(signal->attr)
{
info = signal->attr->get_config();
}
}
catch (Tango::DevFailed &e)
{
INFO_STREAM <<"event_table::"<<__func__<< " ERROR for " << signame << " in get_config err=" << e.errors[0].desc << endl;
}
}
//DEBUG_STREAM <<"event_table::"<< __func__<< " created proxy to " << signame << endl;
......@@ -849,29 +837,6 @@ void event_table::subscribe_events()
}
}
sig->event_cb = new EventCallBack(static_cast<Alarm_ns::Alarm *>(mydev));
Tango::AttributeInfo info;
try
{
sig->siglock->writerOut();
sig->siglock->readerIn();
info = sig->attr->get_config();
sig->siglock->readerOut();
sig->siglock->writerIn();
}
catch (Tango::DevFailed &e)
{
Tango::Except::print_exception(e);
//sig->siglock->writerOut();
sig->siglock->readerOut();
sig->siglock->writerIn();
sig->event_id = SUB_ERR;
delete sig->event_cb;
sig->ex_reason = e.errors[0].reason;
sig->ex_desc = e.errors[0].desc;
sig->ex_origin = e.errors[0].origin;
sig->siglock->writerOut();
continue;
}
sig->first = true;
sig->first_err = true;
DEBUG_STREAM << "event_table::"<<__func__<<":Subscribing for " << sig->name << " " << (sig->first ? "FIRST" : "NOT FIRST") << endl;
......@@ -931,6 +896,7 @@ void event_table::subscribe_events()
void event_table::start(string &signame)
{
DEBUG_STREAM << "event_table::"<<__func__<< " entering signame=" << signame << endl;
ReaderLock lock(veclock);
vector<string> contexts;
for (unsigned int i=0 ; i<v_event.size() ; i++)
......@@ -1057,60 +1023,6 @@ void event_table::start_all()
}
void event_table::update_events(bei_t &e) throw(string&)
{
//LOG_STREAM << "event_table::update_events(bei_t &e): Entering..." << endl ;
vector<event>::iterator found = \
find(v_event.begin(), v_event.end(), e.ev_name);
if (found == v_event.end())
{
//try to remove network domain and FQDN
string ev_name_str(e.ev_name);
string::size_type pos_slash = ev_name_str.find("tango://");
if (pos_slash != string::npos) //FQDN!!
{
//first remove network domain if any
string::size_type pos_dot = ev_name_str.find(".",8); //look for first . after tango://
string::size_type pos_colon = ev_name_str.find(":",8); //look for first : after tango://
pos_slash = ev_name_str.find('/',8); //look for first / after tango://
if(pos_dot < pos_slash && pos_dot != string::npos && pos_colon != string::npos && pos_slash != string::npos) //dot is in the TANGO_HOST part
{
string ev_name_str_no_domain = ev_name_str.substr(0,pos_dot) + ev_name_str.substr(pos_colon);
//LOG_STREAM << __FUNCTION__ << " event "<< e.ev_name << " not found, trying without domain: " << ev_name_str_no_domain << endl;
found = \
find(v_event.begin(), v_event.end(), ev_name_str_no_domain);
}
if (found == v_event.end() && pos_slash != string::npos)
{
ev_name_str = ev_name_str.substr(pos_slash + 1);//remove FQDN
//LOG_STREAM << __FUNCTION__ << " event "<< e.ev_name << " not found, trying without fqdn: " << ev_name_str << endl;
found = \
find(v_event.begin(), v_event.end(), ev_name_str);
}
}
if (found == v_event.end())
{
/*
* shouldn't happen!!!
*/
ostringstream o;
o << "event_table::update_events(): event '" \
<< e.ev_name << "' not found! error=" << e.msg << ends;
ERROR_STREAM << o.str() << endl;
//cerr << o.str() << endl;
throw o.str();
}
}
if (found != v_event.end())
{
found->value = e.value;
found->ts = e.ts;
found->type = e.type;
}
}
//=============================================================================
//=============================================================================
bool event_table::get_if_stop()
......
......@@ -118,7 +118,7 @@ typedef struct basic_event_info_s {
*/
class event_list : public omni_mutex {
public:
event_list(void): full(this), empty(this) {}
event_list(void): empty(this) {}
~event_list(void) {}
void push_back(bei_t& e);
const bei_t pop_front(void);
......@@ -127,8 +127,7 @@ class event_list : public omni_mutex {
protected:
list<bei_t> l_event;
private:
omni_condition full,
empty;
omni_condition empty;
};
/*
......@@ -159,7 +158,6 @@ class event_table : public Tango::TangoMonitor, public Tango::LogAdapter {
void unsubscribe_events();
void start(string &signame);
void start_all();
void update_events(bei_t& e) throw(string&);
void update_property();
/**
* return number of signals to be subscribed
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment