Commit 4dcae342 authored by Pavel Vainerman's avatar Pavel Vainerman

(SharedMemory): рефакторинг, оптимизация

parent 913eb480
...@@ -298,7 +298,7 @@ bool SharedMemory::activateObject() ...@@ -298,7 +298,7 @@ bool SharedMemory::activateObject()
res = IONotifyController::activateObject(); res = IONotifyController::activateObject();
// инициализируем указатели // инициализируем указатели
for( auto && it : hlist ) for( auto && it : hblist )
{ {
it.a_it = myioEnd(); it.a_it = myioEnd();
it.d_it = myioEnd(); it.d_it = myioEnd();
...@@ -312,6 +312,14 @@ bool SharedMemory::activateObject() ...@@ -312,6 +312,14 @@ bool SharedMemory::activateObject()
hit.ioit = myioEnd(); hit.ioit = myioEnd();
} }
for( auto&& it: histmap )
{
auto i = myiofind(it.first);
if( i!= myioEnd() )
i->second->userdata[udataHistory] = (void*)(&(it.second));
}
// здесь или в startUp? // здесь или в startUp?
initFromReserv(); initFromReserv();
...@@ -342,7 +350,7 @@ void SharedMemory::sigterm( int signo ) ...@@ -342,7 +350,7 @@ void SharedMemory::sigterm( int signo )
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void SharedMemory::checkHeartBeat() void SharedMemory::checkHeartBeat()
{ {
if( hlist.empty() ) if( hblist.empty() )
{ {
if( wdt && workready ) if( wdt && workready )
wdt->ping(); wdt->ping();
...@@ -352,7 +360,7 @@ void SharedMemory::checkHeartBeat() ...@@ -352,7 +360,7 @@ void SharedMemory::checkHeartBeat()
bool wdtpingOK = true; bool wdtpingOK = true;
for( auto && it : hlist ) for( auto && it : hblist )
{ {
try try
{ {
...@@ -480,7 +488,7 @@ bool SharedMemory::readItem( const std::shared_ptr<UniXML>& xml, UniXML::iterato ...@@ -480,7 +488,7 @@ bool SharedMemory::readItem( const std::shared_ptr<UniXML>& xml, UniXML::iterato
// без проверки на дублирование т.к. // без проверки на дублирование т.к.
// id - гарантирует уникальность в нашем configure.xml // id - гарантирует уникальность в нашем configure.xml
hlist.push_back(hi); hblist.push_back(hi);
return true; return true;
} }
...@@ -560,7 +568,7 @@ void SharedMemory::readEventList( const std::string& oname ) ...@@ -560,7 +568,7 @@ void SharedMemory::readEventList( const std::string& oname )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void SharedMemory::sendEvent( UniSetTypes::SystemMessage& sm ) void SharedMemory::sendEvent( UniSetTypes::SystemMessage& sm )
{ {
TransportMessage tm(sm.transport_msg()); TransportMessage tm( std::move(sm.transport_msg()) );
for( const auto& it : elst ) for( const auto& it : elst )
{ {
...@@ -739,37 +747,42 @@ void SharedMemory::saveHistory() ...@@ -739,37 +747,42 @@ void SharedMemory::saveHistory()
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void SharedMemory::updateHistory( std::shared_ptr<USensorInfo>& s_it, IOController* ) void SharedMemory::updateHistory( std::shared_ptr<USensorInfo>& usi, IOController* )
{ {
if( hist.empty() ) if( hist.empty() )
return; return;
auto i = histmap.find(s_it->si.id); if( usi->userdata[udataHistory] == nullptr )
if( i == histmap.end() )
return; return;
HistoryItList& lst = *(static_cast<HistoryItList*>(usi->userdata[udataHistory]));
// auto i = histmap.find(s_it->si.id);
//
// if( i == histmap.end() )
// return;
long value = 0; long value = 0;
long sm_tv_sec = 0; long sm_tv_sec = 0;
long sm_tv_usec = 0; long sm_tv_usec = 0;
{ {
uniset_rwmutex_rlock lock(s_it->val_lock); uniset_rwmutex_rlock lock(usi->val_lock);
value = s_it->value; value = usi->value;
sm_tv_sec = s_it->tv_sec; sm_tv_sec = usi->tv_sec;
sm_tv_usec = s_it->tv_usec; sm_tv_usec = usi->tv_usec;
} }
sminfo << myname << "(updateHistory): " sminfo << myname << "(updateHistory): "
<< " sid=" << s_it->si.id << " sid=" << usi->si.id
<< " value=" << value << " value=" << value
<< endl; << endl;
for( auto && it1 : i->second ) for( auto && it1 : lst)
{ {
History::iterator it = it1; History::iterator it = it1;
if( s_it->type == UniversalIO::DI || if( usi->type == UniversalIO::DI ||
s_it->type == UniversalIO::DO ) usi->type == UniversalIO::DO )
{ {
bool st = (bool)value; bool st = (bool)value;
...@@ -785,8 +798,8 @@ void SharedMemory::updateHistory( std::shared_ptr<USensorInfo>& s_it, IOControll ...@@ -785,8 +798,8 @@ void SharedMemory::updateHistory( std::shared_ptr<USensorInfo>& s_it, IOControll
m_historySignal.emit( (*it) ); m_historySignal.emit( (*it) );
} }
} }
else if( s_it->type == UniversalIO::AI || else if( usi->type == UniversalIO::AI ||
s_it->type == UniversalIO::AO ) usi->type == UniversalIO::AO )
{ {
if( !it->fuse_use_val ) if( !it->fuse_use_val )
{ {
......
...@@ -317,7 +317,6 @@ class SharedMemory: ...@@ -317,7 +317,6 @@ class SharedMemory:
void addReadItem( Restorer_XML::ReaderSlot sl ); void addReadItem( Restorer_XML::ReaderSlot sl );
// ------------ HISTORY -------------------- // ------------ HISTORY --------------------
typedef std::deque<long> HBuffer; typedef std::deque<long> HBuffer;
...@@ -326,7 +325,7 @@ class SharedMemory: ...@@ -326,7 +325,7 @@ class SharedMemory:
explicit HistoryItem( size_t bufsize = 0 ): id(UniSetTypes::DefaultObjectId), buf(bufsize) {} explicit HistoryItem( size_t bufsize = 0 ): id(UniSetTypes::DefaultObjectId), buf(bufsize) {}
HistoryItem( const UniSetTypes::ObjectId _id, const size_t bufsize, const long val ): id(_id), buf(bufsize, val) {} HistoryItem( const UniSetTypes::ObjectId _id, const size_t bufsize, const long val ): id(_id), buf(bufsize, val) {}
inline void init( unsigned int size, long val ) inline void init( size_t size, long val )
{ {
if( size > 0 ) if( size > 0 )
buf.assign(size, val); buf.assign(size, val);
...@@ -339,7 +338,7 @@ class SharedMemory: ...@@ -339,7 +338,7 @@ class SharedMemory:
void add( long val, size_t size ) void add( long val, size_t size )
{ {
// т.е. буфер у нас уже заданного размера // т.к. буфер у нас уже заданного размера
// то просто удаляем очередную точку в начале // то просто удаляем очередную точку в начале
// и добавляем в конце // и добавляем в конце
buf.pop_front(); buf.pop_front();
...@@ -388,6 +387,14 @@ class SharedMemory: ...@@ -388,6 +387,14 @@ class SharedMemory:
typedef std::list<History::iterator> HistoryItList; typedef std::list<History::iterator> HistoryItList;
typedef std::unordered_map<UniSetTypes::ObjectId, HistoryItList> HistoryFuseMap; typedef std::unordered_map<UniSetTypes::ObjectId, HistoryItList> HistoryFuseMap;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет
//! использовать userdata[2]. (0,1 - использует IONotifyController)
// оптимизация с использованием userdata (IOController::USensorInfo::userdata) нужна
// чтобы не использовать поиск в HistoryFuseMap (см. updateHistory)
// т.к. 0,1 - использует IONotifyController (см. IONotifyController::UserDataID)
// то используем 2 - в качестве элемента userdata
static const size_t udataHistory = 2;
typedef sigc::signal<void, const HistoryInfo&> HistorySlot; typedef sigc::signal<void, const HistoryInfo&> HistorySlot;
HistorySlot signal_history(); /*!< сигнал о срабатывании условий "сброса" дампа истории */ HistorySlot signal_history(); /*!< сигнал о срабатывании условий "сброса" дампа истории */
...@@ -468,7 +475,7 @@ class SharedMemory: ...@@ -468,7 +475,7 @@ class SharedMemory:
void checkHeartBeat(); void checkHeartBeat();
typedef std::list<HeartBeatInfo> HeartBeatList; typedef std::list<HeartBeatInfo> HeartBeatList;
HeartBeatList hlist; // список датчиков "сердцебиения" HeartBeatList hblist; // список датчиков "сердцебиения"
std::shared_ptr<WDTInterface> wdt; std::shared_ptr<WDTInterface> wdt;
std::atomic_bool activated; std::atomic_bool activated;
std::atomic_bool workready; std::atomic_bool workready;
...@@ -488,7 +495,7 @@ class SharedMemory: ...@@ -488,7 +495,7 @@ class SharedMemory:
History hist; History hist;
HistoryFuseMap histmap; /*!< map для оптимизации поиска */ HistoryFuseMap histmap; /*!< map для оптимизации поиска */
virtual void updateHistory( std::shared_ptr<IOController::USensorInfo>& it, IOController* ); virtual void updateHistory(std::shared_ptr<IOController::USensorInfo>& usi, IOController* );
virtual void saveHistory(); virtual void saveHistory();
void buildHistoryList( xmlNode* cnode ); void buildHistoryList( xmlNode* cnode );
......
...@@ -285,10 +285,8 @@ class IOController: ...@@ -285,10 +285,8 @@ class IOController:
// Дополнительные (вспомогательные поля) // Дополнительные (вспомогательные поля)
UniSetTypes::uniset_rwmutex val_lock; /*!< флаг блокирующий работу со значением */ UniSetTypes::uniset_rwmutex val_lock; /*!< флаг блокирующий работу со значением */
std::shared_ptr<USensorInfo> it; static const size_t MaxUserData = 4;
void* userdata[MaxUserData] = { nullptr, nullptr, nullptr, nullptr }; /*!< расширение для возможности хранения своей информации */
static const size_t MaxUserData = 3;
void* userdata[MaxUserData] = { nullptr, nullptr, nullptr }; /*!< расширение для возможности хранения своей информации */
// сигнал для реализации механизма зависимостией.. // сигнал для реализации механизма зависимостией..
// (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals) // (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
...@@ -301,9 +299,10 @@ class IOController: ...@@ -301,9 +299,10 @@ class IOController:
IOController_i::SensorInfo d_si; /*!< идентификатор датчика, от которого зависит данный */ IOController_i::SensorInfo d_si; /*!< идентификатор датчика, от которого зависит данный */
long d_value; /*!< разрешающее работу значение датчика от которого зависит данный */ long d_value; /*!< разрешающее работу значение датчика от которого зависит данный */
long d_off_value; /*!< блокирующее значение */ long d_off_value; /*!< блокирующее значение */
std::shared_ptr<USensorInfo> d_usi; // shared_ptr на датчик от которого зависит этот.
// функция обработки информации об изменении состояния датчика, от которого зависит данный // функция обработки информации об изменении состояния датчика, от которого зависит данный
void checkDepend( std::shared_ptr<USensorInfo>& it, IOController* ); void checkDepend( std::shared_ptr<USensorInfo>& d_usi, IOController* );
void init( const IOController_i::SensorIOInfo& s ); void init( const IOController_i::SensorIOInfo& s );
......
...@@ -302,6 +302,8 @@ class IONotifyController: ...@@ -302,6 +302,8 @@ class IONotifyController:
virtual void localSetValue( std::shared_ptr<USensorInfo>& usi, virtual void localSetValue( std::shared_ptr<USensorInfo>& usi,
CORBA::Long value, UniSetTypes::ObjectId sup_id ) override; CORBA::Long value, UniSetTypes::ObjectId sup_id ) override;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
// идентификаторы данные в userdata (см. USensorInfo::userdata) // идентификаторы данные в userdata (см. USensorInfo::userdata)
enum UserDataID enum UserDataID
{ {
......
...@@ -755,7 +755,6 @@ IOController::ChangeSignal IOController::signal_change_value( UniSetTypes::Objec ...@@ -755,7 +755,6 @@ IOController::ChangeSignal IOController::signal_change_value( UniSetTypes::Objec
throw IOController_i::NameNotFound(err.str().c_str()); throw IOController_i::NameNotFound(err.str().c_str());
} }
uniset_rwmutex_rlock lock(it->second->val_lock);
return it->second->sigChange; return it->second->sigChange;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -779,7 +778,7 @@ IOController::ChangeUndefinedStateSignal IOController::signal_change_undefined_s ...@@ -779,7 +778,7 @@ IOController::ChangeUndefinedStateSignal IOController::signal_change_undefined_s
throw IOController_i::NameNotFound(err.str().c_str()); throw IOController_i::NameNotFound(err.str().c_str());
} }
uniset_rwmutex_rlock lock(it->second->val_lock); // uniset_rwmutex_rlock lock(it->second->val_lock);
return it->second->sigUndefChange; return it->second->sigUndefChange;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -811,7 +810,7 @@ void IOController::USensorInfo::checkDepend( std::shared_ptr<USensorInfo>& d_it, ...@@ -811,7 +810,7 @@ void IOController::USensorInfo::checkDepend( std::shared_ptr<USensorInfo>& d_it,
<< endl; << endl;
if( changed ) if( changed )
ic->localSetValue( it, real_value, sup_id ); ic->localSetValue( d_usi, real_value, sup_id );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
UniSetTypes::SimpleInfo* IOController::getInfo( ::CORBA::Long userparam ) UniSetTypes::SimpleInfo* IOController::getInfo( ::CORBA::Long userparam )
......
...@@ -265,6 +265,7 @@ void IONotifyController::ask( AskMap& askLst, const UniSetTypes::ObjectId sid, ...@@ -265,6 +265,7 @@ void IONotifyController::ask( AskMap& askLst, const UniSetTypes::ObjectId sid,
if( askIterator != askLst.end() ) if( askIterator != askLst.end() )
{ {
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
auto s = myiofind(sid); auto s = myiofind(sid);
if( s != myioEnd() ) if( s != myioEnd() )
s->second->userdata[udataConsumerList] =(void*)(&(askIterator->second)); s->second->userdata[udataConsumerList] =(void*)(&(askIterator->second));
...@@ -326,6 +327,7 @@ void IONotifyController::localSetValue( std::shared_ptr<IOController::USensorInf ...@@ -326,6 +327,7 @@ void IONotifyController::localSetValue( std::shared_ptr<IOController::USensorInf
{ {
uniset_rwmutex_rlock lock(askIOMutex); uniset_rwmutex_rlock lock(askIOMutex);
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if( usi->userdata[udataConsumerList] != nullptr ) if( usi->userdata[udataConsumerList] != nullptr )
{ {
ConsumerListInfo& lst = *(static_cast<ConsumerListInfo*>(usi->userdata[udataConsumerList])); ConsumerListInfo& lst = *(static_cast<ConsumerListInfo*>(usi->userdata[udataConsumerList]));
...@@ -615,6 +617,7 @@ void IONotifyController::askThreshold(UniSetTypes::ObjectId sid, const UniSetTyp ...@@ -615,6 +617,7 @@ void IONotifyController::askThreshold(UniSetTypes::ObjectId sid, const UniSetTyp
it = askTMap.find(sid); it = askTMap.find(sid);
if( li != myioEnd() ) if( li != myioEnd() )
{ {
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if( it == askTMap.end() ) if( it == askTMap.end() )
li->second->userdata[udataThresholdList] = nullptr; li->second->userdata[udataThresholdList] = nullptr;
else else
...@@ -694,9 +697,11 @@ void IONotifyController::checkThreshold( std::shared_ptr<IOController::USensorIn ...@@ -694,9 +697,11 @@ void IONotifyController::checkThreshold( std::shared_ptr<IOController::USensorIn
{ {
uniset_rwmutex_rlock lock(trshMutex); uniset_rwmutex_rlock lock(trshMutex);
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if( usi->userdata[udataThresholdList] == nullptr ) if( usi->userdata[udataThresholdList] == nullptr )
return; return;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
ti = static_cast<ThresholdsListInfo*>(usi->userdata[udataThresholdList]); ti = static_cast<ThresholdsListInfo*>(usi->userdata[udataThresholdList]);
if( ti->list.empty() ) if( ti->list.empty() )
return; return;
...@@ -958,6 +963,7 @@ void IONotifyController::onChangeUndefinedState( std::shared_ptr<USensorInfo>& u ...@@ -958,6 +963,7 @@ void IONotifyController::onChangeUndefinedState( std::shared_ptr<USensorInfo>& u
{ {
// lock // lock
uniset_rwmutex_rlock lock(askIOMutex); uniset_rwmutex_rlock lock(askIOMutex);
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if( usi->userdata[udataConsumerList] != nullptr ) if( usi->userdata[udataConsumerList] != nullptr )
{ {
ConsumerListInfo& lst = *(static_cast<ConsumerListInfo*>(usi->userdata[udataConsumerList])); ConsumerListInfo& lst = *(static_cast<ConsumerListInfo*>(usi->userdata[udataConsumerList]));
......
...@@ -121,6 +121,7 @@ void NCRestorer::addthresholdlist( IONotifyController* ic, std::shared_ptr<IOCon ...@@ -121,6 +121,7 @@ void NCRestorer::addthresholdlist( IONotifyController* ic, std::shared_ptr<IOCon
{ {
auto i = ic->myiofind(inf->si.id); auto i = ic->myiofind(inf->si.id);
ic->askTMap[inf->si.id].usi = i->second; ic->askTMap[inf->si.id].usi = i->second;
//! \warning Оптимизация использует userdata! Это опасно, если кто-то ещё захочет его использовать!
if( i->second ) if( i->second )
i->second->userdata[IONotifyController::udataThresholdList] = &(ic->askTMap[inf->si.id]); i->second->userdata[IONotifyController::udataThresholdList] = &(ic->askTMap[inf->si.id]);
} }
...@@ -176,7 +177,7 @@ void NCRestorer::init_depends_signals( IONotifyController* ic ) ...@@ -176,7 +177,7 @@ void NCRestorer::init_depends_signals( IONotifyController* ic )
for( auto it = ic->ioList.begin(); it != ic->ioList.end(); ++it ) for( auto it = ic->ioList.begin(); it != ic->ioList.end(); ++it )
{ {
// обновляем итераторы... // обновляем итераторы...
it->second->it = it->second; it->second->d_usi = it->second;
if( it->second->d_si.id == DefaultObjectId ) if( it->second->d_si.id == DefaultObjectId )
continue; continue;
...@@ -186,6 +187,7 @@ void NCRestorer::init_depends_signals( IONotifyController* ic ) ...@@ -186,6 +187,7 @@ void NCRestorer::init_depends_signals( IONotifyController* ic )
<< " dep_name=(" << it->second->d_si.id << ")'" << uniset_conf()->oind->getMapName(it->second->d_si.id) << "'" << " dep_name=(" << it->second->d_si.id << ")'" << uniset_conf()->oind->getMapName(it->second->d_si.id) << "'"
<< endl; << endl;
uniset_rwmutex_rlock lock(it->second->val_lock);
ic->signal_change_value(it->second->d_si.id).connect( sigc::mem_fun( it->second.get(), &IOController::USensorInfo::checkDepend) ); ic->signal_change_value(it->second->d_si.id).connect( sigc::mem_fun( it->second.get(), &IOController::USensorInfo::checkDepend) );
} }
} }
......
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