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