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

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

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