Commit c751a705 authored by Pavel Vainerman's avatar Pavel Vainerman

(UNet): оптимизировал работу (заменил vector на unordered_map)

для режима работы по sensorInfo, т.е. когда идёт работа без указателя на SM.
parent 609a3abf
...@@ -45,6 +45,9 @@ ${START} -f ./uniset2-smemory-plus --smemory-id SharedMemory --confile test.xml ...@@ -45,6 +45,9 @@ ${START} -f ./uniset2-smemory-plus --smemory-id SharedMemory --confile test.xml
$MBMS \ $MBMS \
$MBS \ $MBS \
--ulog-add-levels system \ --ulog-add-levels system \
--add-unet \
--unet-name UNetExchange --unet-run-logserver \
--unet-filter-field rs --unet-filter-value 2 --unet-maxdifferense 40 --unet-sendpause 1000
$* $*
# --add-rtu \ # --add-rtu \
# --rs-dev /dev/cbsideA1 \ # --rs-dev /dev/cbsideA1 \
......
...@@ -39,7 +39,7 @@ UNetSender::UNetSender(const std::string& _host, const int _port, const std::sha ...@@ -39,7 +39,7 @@ UNetSender::UNetSender(const std::string& _host, const int _port, const std::sha
sendpause(150), sendpause(150),
packsendpause(5), packsendpause(5),
activated(false), activated(false),
dlist(100), items(100),
maxItem(0), maxItem(0),
packetnum(1), packetnum(1),
lastcrc(0), lastcrc(0),
...@@ -83,8 +83,7 @@ UNetSender::UNetSender(const std::string& _host, const int _port, const std::sha ...@@ -83,8 +83,7 @@ UNetSender::UNetSender(const std::string& _host, const int _port, const std::sha
if( shm->isLocalwork() ) if( shm->isLocalwork() )
{ {
readConfiguration(); readConfiguration();
dlist.resize(maxItem); unetinfo << myname << "(init): dlist size = " << items.size() << endl;
unetinfo << myname << "(init): dlist size = " << dlist.size() << endl;
} }
else else
{ {
...@@ -96,8 +95,7 @@ UNetSender::UNetSender(const std::string& _host, const int _port, const std::sha ...@@ -96,8 +95,7 @@ UNetSender::UNetSender(const std::string& _host, const int _port, const std::sha
{ {
unetwarn << myname << "(init): Failed to convert the pointer 'IONotifyController' -> 'SharedMemory'" << endl; unetwarn << myname << "(init): Failed to convert the pointer 'IONotifyController' -> 'SharedMemory'" << endl;
readConfiguration(); readConfiguration();
dlist.resize(maxItem); unetinfo << myname << "(init): dlist size = " << items.size() << endl;
unetinfo << myname << "(init): dlist size = " << dlist.size() << endl;
} }
} }
} }
...@@ -146,12 +144,11 @@ bool UNetSender::createConnection( bool throwEx ) ...@@ -146,12 +144,11 @@ bool UNetSender::createConnection( bool throwEx )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::updateFromSM() void UNetSender::updateFromSM()
{ {
auto it = dlist.begin(); for( auto&& it: items )
for( ; it != dlist.end(); ++it )
{ {
long value = shm->localGetValue(it->ioit, it->id); UItem& i = it.second;
updateItem(it, value); long value = shm->localGetValue(i.ioit, i.id);
updateItem(i, value);
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -160,38 +157,20 @@ void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value ) ...@@ -160,38 +157,20 @@ void UNetSender::updateSensor( UniSetTypes::ObjectId id, long value )
if( !shm->isLocalwork() ) if( !shm->isLocalwork() )
return; return;
// cerr << myname << ": UPDATE SENSOR id=" << id << " value=" << value << endl; auto it = items.find(id);
auto it = dlist.begin(); if( it != items.end() )
updateItem( it->second, value );
for( ; it != dlist.end(); ++it )
{
if( it->id == id )
{
updateItem( it, value );
break;
}
}
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::updateItem( DMap::iterator& it, long value ) void UNetSender::updateItem( UItem& it, long value )
{ {
if( it == dlist.end() )
return;
if( it->iotype == UniversalIO::DI || it->iotype == UniversalIO::DO )
{
UniSetTypes::uniset_rwmutex_wrlock l(pack_mutex); UniSetTypes::uniset_rwmutex_wrlock l(pack_mutex);
auto& pk = mypacks[it->pack_sendfactor]; auto& pk = mypacks[it.pack_sendfactor];
UniSetUDP::UDPMessage& mypack(pk[it->pack_num]); UniSetUDP::UDPMessage& mypack(pk[it.pack_num]);
mypack.setDData(it->pack_ind, value); if( it.iotype == UniversalIO::DI || it.iotype == UniversalIO::DO )
} mypack.setDData(it.pack_ind, value);
else if( it->iotype == UniversalIO::AI || it->iotype == UniversalIO::AO ) else if( it.iotype == UniversalIO::AI || it.iotype == UniversalIO::AO )
{ mypack.setAData(it.pack_ind, value);
UniSetTypes::uniset_rwmutex_wrlock l(pack_mutex);
auto& pk = mypacks[it->pack_sendfactor];
UniSetUDP::UDPMessage& mypack(pk[it->pack_num]);
mypack.setAData(it->pack_ind, value);
}
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::setCheckConnectionPause( int msec ) void UNetSender::setCheckConnectionPause( int msec )
...@@ -202,8 +181,7 @@ void UNetSender::setCheckConnectionPause( int msec ) ...@@ -202,8 +181,7 @@ void UNetSender::setCheckConnectionPause( int msec )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::send() void UNetSender::send()
{ {
dlist.resize(maxItem); unetinfo << myname << "(send): dlist size = " << items.size() << endl;
unetinfo << myname << "(send): dlist size = " << dlist.size() << endl;
ncycle = 0; ncycle = 0;
ptCheckConnection.reset(); ptCheckConnection.reset();
...@@ -493,10 +471,7 @@ bool UNetSender::initItem( UniXML::iterator& it ) ...@@ -493,10 +471,7 @@ bool UNetSender::initItem( UniXML::iterator& it )
mypacks[priority] = pk; mypacks[priority] = pk;
if( maxItem >= dlist.size() ) items[p.id] = p;
dlist.resize(maxItem + 10);
dlist[maxItem] = p;
maxItem++; maxItem++;
unetinfo << myname << "(initItem): add " << p << endl; unetinfo << myname << "(initItem): add " << p << endl;
...@@ -511,14 +486,14 @@ std::ostream& operator<<( std::ostream& os, UNetSender::UItem& p ) ...@@ -511,14 +486,14 @@ std::ostream& operator<<( std::ostream& os, UNetSender::UItem& p )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::initIterators() void UNetSender::initIterators()
{ {
for( auto && it : dlist ) for( auto && it : items )
shm->initIterator(it.ioit); shm->initIterator(it.second.ioit);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::askSensors( UniversalIO::UIOCommand cmd ) void UNetSender::askSensors( UniversalIO::UIOCommand cmd )
{ {
for( auto && it : dlist ) for( auto && it : items )
shm->askSensor(it.id, cmd); shm->askSensor(it.second.id, cmd);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
size_t UNetSender::getDataPackCount() const size_t UNetSender::getDataPackCount() const
......
...@@ -91,7 +91,7 @@ class UNetSender ...@@ -91,7 +91,7 @@ class UNetSender
friend std::ostream& operator<<( std::ostream& os, UItem& p ); friend std::ostream& operator<<( std::ostream& os, UItem& p );
}; };
typedef std::vector<UItem> DMap; typedef std::unordered_map<UniSetTypes::ObjectId,UItem> UItemMap;
size_t getDataPackCount() const; size_t getDataPackCount() const;
...@@ -108,7 +108,7 @@ class UNetSender ...@@ -108,7 +108,7 @@ class UNetSender
void updateSensor( UniSetTypes::ObjectId id, long value ); void updateSensor( UniSetTypes::ObjectId id, long value );
/*! Обновить значение по итератору */ /*! Обновить значение по итератору */
void updateItem( DMap::iterator& it, long value ); void updateItem( UItem& it, long value );
inline void setSendPause( int msec ) inline void setSendPause( int msec )
{ {
...@@ -191,7 +191,7 @@ class UNetSender ...@@ -191,7 +191,7 @@ class UNetSender
Packs mypacks; Packs mypacks;
std::unordered_map<sendfactor_t, size_t> packs_anum; std::unordered_map<sendfactor_t, size_t> packs_anum;
std::unordered_map<sendfactor_t, size_t> packs_dnum; std::unordered_map<sendfactor_t, size_t> packs_dnum;
DMap dlist; UItemMap items;
size_t maxItem = { 0 }; size_t maxItem = { 0 };
size_t packetnum = { 1 }; /*!< номер очередного посылаемого пакета */ size_t packetnum = { 1 }; /*!< номер очередного посылаемого пакета */
uint16_t lastcrc = { 0 }; uint16_t lastcrc = { 0 };
......
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