Commit b4b70147 authored by Pavel Vainerman's avatar Pavel Vainerman

(SM): Оптимизация: 1) перевёл механизм аварийного следа с std::list на…

(SM): Оптимизация: 1) перевёл механизм аварийного следа с std::list на std::deque, т.к. у std::list - дорогой вызов size(), а так же, нам собственно требуется в основном работы с добавление и удаление в начало и конец буфера. Профайлер показал "выигрышь" в HistoryItem::add(). 2) Заодно перевёл "активацию" с mutex, на atomic (хотя commoncpp, всё-равно внутри для atomic использует pthread_mutex).
parent 705d6b82
...@@ -36,13 +36,12 @@ SharedMemory::SharedMemory( ObjectId id, string datafile, std::string confname ) ...@@ -36,13 +36,12 @@ SharedMemory::SharedMemory( ObjectId id, string datafile, std::string confname )
heartbeatCheckTime(5000), heartbeatCheckTime(5000),
histSaveTime(0), histSaveTime(0),
wdt(0), wdt(0),
activated(false), activated(0),
workready(false), workready(0),
dblogging(false), dblogging(false),
msecPulsar(0) msecPulsar(0)
{ {
mutex_start.setName(myname + "_mutex_start"); mutex_start.setName(myname + "_mutex_start");
mutex_act.setName(myname + "_mutex_act");
string cname(confname); string cname(confname);
if( cname.empty() ) if( cname.empty() )
...@@ -140,7 +139,7 @@ void SharedMemory::timerInfo( const TimerMessage *tm ) ...@@ -140,7 +139,7 @@ void SharedMemory::timerInfo( const TimerMessage *tm )
checkHeartBeat(); checkHeartBeat();
else if( tm->id == tmEvent ) else if( tm->id == tmEvent )
{ {
workready = true; workready = 1;
// рассылаем уведомление, о том, чтобы стартанули // рассылаем уведомление, о том, чтобы стартанули
SystemMessage sm1(SystemMessage::WatchDog); SystemMessage sm1(SystemMessage::WatchDog);
sendEvent(sm1); sendEvent(sm1);
...@@ -223,7 +222,7 @@ void SharedMemory::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -223,7 +222,7 @@ void SharedMemory::askSensors( UniversalIO::UIOCommand cmd )
dlog.crit() << myname << "(askSensors): " << ex << endl; dlog.crit() << myname << "(askSensors): " << ex << endl;
} }
} }
*/ */
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -231,25 +230,22 @@ bool SharedMemory::activateObject() ...@@ -231,25 +230,22 @@ bool SharedMemory::activateObject()
{ {
PassiveTimer pt(UniSetTimer::WaitUpTime); PassiveTimer pt(UniSetTimer::WaitUpTime);
bool res = true; bool res = true;
// блокирование обработки Startup // блокирование обработки Startup
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
{ activated = 0;
uniset_rwmutex_wrlock l(mutex_act);
activated = false;
}
UniSetTypes::uniset_rwmutex_wrlock l(mutex_start); UniSetTypes::uniset_rwmutex_wrlock l(mutex_start);
res = IONotifyController_LT::activateObject(); res = IONotifyController_LT::activateObject();
// инициализируем указатели // инициализируем указатели
for( HeartBeatList::iterator it=hlist.begin(); it!=hlist.end(); ++it ) for( HeartBeatList::iterator it=hlist.begin(); it!=hlist.end(); ++it )
{ {
it->ioit = myioEnd(); it->ioit = myioEnd();
} }
itPulsar = myioEnd(); itPulsar = myioEnd();
for( History::iterator it=hist.begin(); it!=hist.end(); ++it ) for( History::iterator it=hist.begin(); it!=hist.end(); ++it )
...@@ -258,10 +254,7 @@ bool SharedMemory::activateObject() ...@@ -258,10 +254,7 @@ bool SharedMemory::activateObject()
hit->ioit = myioEnd(); hit->ioit = myioEnd();
} }
{ activated = 1;
uniset_rwmutex_wrlock l(mutex_act);
activated = true;
}
} }
cerr << "************************** activate: " << pt.getCurrent() << " msec " << endl; cerr << "************************** activate: " << pt.getCurrent() << " msec " << endl;
...@@ -335,7 +328,7 @@ void SharedMemory::checkHeartBeat() ...@@ -335,7 +328,7 @@ void SharedMemory::checkHeartBeat()
dcrit << myname << "(checkHeartBeat): ..." << endl; dcrit << myname << "(checkHeartBeat): ..." << endl;
} }
} }
if( wdt && wdtpingOK && workready ) if( wdt && wdtpingOK && workready )
wdt->ping(); wdt->ping();
} }
...@@ -656,7 +649,7 @@ void SharedMemory::saveHistory() ...@@ -656,7 +649,7 @@ void SharedMemory::saveHistory()
si.node = conf->getLocalNode(); si.node = conf->getLocalNode();
try try
{ {
hit->add( localGetValue( hit->ioit, si ), it->size ); hit->add( localGetValue( hit->ioit, si ), it->size );
continue; continue;
} }
...@@ -753,7 +746,7 @@ std::ostream& operator<<( std::ostream& os, const SharedMemory::HistoryInfo& h ) ...@@ -753,7 +746,7 @@ std::ostream& operator<<( std::ostream& os, const SharedMemory::HistoryInfo& h )
<< " fuse_val=" << h.fuse_val << " fuse_val=" << h.fuse_val
<< " size=" << h.size << " size=" << h.size
<< " filter=" << h.filter << endl; << " filter=" << h.filter << endl;
for( SharedMemory::HistoryList::const_iterator it=h.hlst.begin(); it!=h.hlst.end(); ++it ) for( SharedMemory::HistoryList::const_iterator it=h.hlst.begin(); it!=h.hlst.end(); ++it )
{ {
os << " id=" << it->id << "["; os << " id=" << it->id << "[";
...@@ -761,13 +754,12 @@ std::ostream& operator<<( std::ostream& os, const SharedMemory::HistoryInfo& h ) ...@@ -761,13 +754,12 @@ std::ostream& operator<<( std::ostream& os, const SharedMemory::HistoryInfo& h )
os << " " << (*i); os << " " << (*i);
os << " ]" << endl; os << " ]" << endl;
} }
return os; return os;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool SharedMemory::isActivated() bool SharedMemory::isActivated()
{ {
uniset_rwmutex_rlock l(mutex_act);
return activated; return activated;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#define SharedMemory_H_ #define SharedMemory_H_
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <string> #include <string>
#include <list> #include <deque>
#include "IONotifyController_LT.h" #include "IONotifyController_LT.h"
#include "Mutex.h" #include "Mutex.h"
#include "PassiveTimer.h" #include "PassiveTimer.h"
...@@ -212,7 +212,7 @@ ...@@ -212,7 +212,7 @@
fuse_value - значение срабатывания (для аналогового "детонатора") fuse_value - значение срабатывания (для аналогового "детонатора")
fuse_invert - ивертировать (для дискретных "детонаторов"). fuse_invert - ивертировать (для дискретных "детонаторов").
Т.е. срабатвание на значение "0". Т.е. срабатвание на значение "0".
size - количество точек в хранимой истории size - количество точек в хранимой истории
filter - поле используемое в качестве фильтра, определяющего датчики filter - поле используемое в качестве фильтра, определяющего датчики
входящие в данную группу (историю). входящие в данную группу (историю).
...@@ -236,7 +236,7 @@ ...@@ -236,7 +236,7 @@
изменение состояния "детонаторов". Если срабатывает заданое условие для изменение состояния "детонаторов". Если срабатывает заданое условие для
"сброса" дампа, инициируется сигнал, в который передаётся идентификатор истории "сброса" дампа, инициируется сигнал, в который передаётся идентификатор истории
и текущая накопленная история. и текущая накопленная история.
\section sec_SM_Pulsar "Мигание" специальным датчиком \section sec_SM_Pulsar "Мигание" специальным датчиком
В SM реализован механизм позволяющий задать специальный дискретный датчик ("пульсар"), В SM реализован механизм позволяющий задать специальный дискретный датчик ("пульсар"),
который будет с заданным периодом менять своё состояние. Идентификатор датчика который будет с заданным периодом менять своё состояние. Идентификатор датчика
...@@ -245,7 +245,7 @@ ...@@ -245,7 +245,7 @@
или в командной строке \b --pulsar-msec. В качестве дискретного датчика можно или в командной строке \b --pulsar-msec. В качестве дискретного датчика можно
задать любой датчик типа DO или DI. Параметр определяющий тип заданного датчика задать любой датчик типа DO или DI. Параметр определяющий тип заданного датчика
\b pulsar_iotype или в командной строке \b --pulsar-iotype. \b pulsar_iotype или в командной строке \b --pulsar-iotype.
\section sec_SM_DBLog Управление сохранением изменений датчиков в БД \section sec_SM_DBLog Управление сохранением изменений датчиков в БД
Для оптимизации, по умолчанию в SM отключено сохранение каждого изменения датчиков в БД Для оптимизации, по умолчанию в SM отключено сохранение каждого изменения датчиков в БД
(реализованное в базовом классе IONotifyController). (реализованное в базовом классе IONotifyController).
...@@ -271,11 +271,11 @@ class SharedMemory: ...@@ -271,11 +271,11 @@ class SharedMemory:
virtual CORBA::Boolean exist(); virtual CORBA::Boolean exist();
void addReadItem( Restorer_XML::ReaderSlot sl ); void addReadItem( Restorer_XML::ReaderSlot sl );
// ------------ HISTORY -------------------- // ------------ HISTORY --------------------
typedef std::list<long> HBuffer; typedef std::deque<long> HBuffer;
struct HistoryItem struct HistoryItem
{ {
HistoryItem():id(UniSetTypes::DefaultObjectId){} HistoryItem():id(UniSetTypes::DefaultObjectId){}
...@@ -289,7 +289,7 @@ class SharedMemory: ...@@ -289,7 +289,7 @@ class SharedMemory:
{ {
buf.push_back(val); buf.push_back(val);
if( buf.size() >= size ) if( buf.size() >= size )
buf.erase(buf.begin()); buf.pop_front();
} }
}; };
...@@ -310,7 +310,7 @@ class SharedMemory: ...@@ -310,7 +310,7 @@ class SharedMemory:
fuse_sec = tv.tv_sec; fuse_sec = tv.tv_sec;
fuse_usec = tv.tv_usec; fuse_usec = tv.tv_usec;
} }
long id; // ID long id; // ID
HistoryList hlst; // history list HistoryList hlst; // history list
int size; int size;
...@@ -400,8 +400,8 @@ class SharedMemory: ...@@ -400,8 +400,8 @@ class SharedMemory:
typedef std::list<HeartBeatInfo> HeartBeatList; typedef std::list<HeartBeatInfo> HeartBeatList;
HeartBeatList hlist; // список датчиков "сердцебиения" HeartBeatList hlist; // список датчиков "сердцебиения"
WDTInterface* wdt; WDTInterface* wdt;
bool activated; UniSetTypes::mutex_atomic_t activated;
bool workready; UniSetTypes::mutex_atomic_t workready;
typedef std::list<UniSetTypes::ObjectId> EventList; typedef std::list<UniSetTypes::ObjectId> EventList;
EventList elst; EventList elst;
...@@ -425,13 +425,10 @@ class SharedMemory: ...@@ -425,13 +425,10 @@ class SharedMemory:
void checkHistoryFilter( UniXML_iterator& it ); void checkHistoryFilter( UniXML_iterator& it );
bool isActivated(); bool isActivated();
IOStateList::iterator itPulsar; IOStateList::iterator itPulsar;
IOController_i::SensorInfo siPulsar; IOController_i::SensorInfo siPulsar;
int msecPulsar; int msecPulsar;
UniSetTypes::uniset_rwmutex mutex_act;
private: private:
HistorySlot m_historySignal; HistorySlot m_historySignal;
}; };
......
Markdown is supported
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