Commit 51f45a5c authored by Pavel Vainerman's avatar Pavel Vainerman

(UNetUDP): мелкие правки

parent aed9494f
......@@ -541,10 +541,10 @@ bool UNetReceiver::recv()
// -----------------------------------------------------------------------------
void UNetReceiver::initIterators()
{
for( auto& it : d_icache )
for( auto&& it : d_icache )
shm->initIterator(it.ioit);
for( auto& it : a_icache )
for( auto&& it : a_icache )
shm->initIterator(it.ioit);
}
// -----------------------------------------------------------------------------
......@@ -558,6 +558,8 @@ void UNetReceiver::initDCache( UniSetUDP::UDPMessage& pack, bool force )
d_icache.resize(pack.dcount);
auto conf = uniset_conf();
for( size_t i = 0; i < d_icache.size(); i++ )
{
ItemInfo& d(d_icache[i]);
......@@ -565,7 +567,7 @@ void UNetReceiver::initDCache( UniSetUDP::UDPMessage& pack, bool force )
if( d.id != pack.d_id[i] )
{
d.id = pack.d_id[i];
d.iotype = uniset_conf()->getIOType(d.id);
d.iotype = conf->getIOType(d.id);
shm->initIterator(d.ioit);
}
}
......@@ -581,6 +583,8 @@ void UNetReceiver::initACache( UniSetUDP::UDPMessage& pack, bool force )
a_icache.resize(pack.acount);
auto conf = uniset_conf();
for( size_t i = 0; i < a_icache.size(); i++ )
{
ItemInfo& d(a_icache[i]);
......@@ -588,7 +592,7 @@ void UNetReceiver::initACache( UniSetUDP::UDPMessage& pack, bool force )
if( d.id != pack.a_dat[i].id )
{
d.id = pack.a_dat[i].id;
d.iotype = uniset_conf()->getIOType(d.id);
d.iotype = conf->getIOType(d.id);
shm->initIterator(d.ioit);
}
}
......
......@@ -28,10 +28,9 @@
* КЭШ
* ===
* Для оптимизации работы с SM, т.к. в пакетах приходят только пары [id,value] сделан кэш итераторов.
* Кэш расчитан на то, что принимаемые пакеты всегда имеют одну и ту же длину и последовательность.
* Идея проста: сделан вектор размером с количество принимаемых данных. В векторе хранятся итераторы (и всё что необходимо).
* Порядковый номер данных в пакете является индексом в кэше.
* Для защиты от изменения поседовательности внутри пакета, в кэше хранится ID сохраняемого датчика, и если он не совпадёт с тем,
* Для защиты от изменения последовательности внутри пакета, в кэше хранится ID сохраняемого датчика, и если он не совпадёт с тем,
* ID который пришёл в пакете - элемент кэша обновляется.
* Если количество пришедших данных не совпадают с размером кэша.. кэш обновляется.
*
......
......@@ -357,17 +357,13 @@ std::ostream& operator<<( std::ostream& os, UNetSender::UItem& p )
// -----------------------------------------------------------------------------
void UNetSender::initIterators()
{
auto it = dlist.begin();
for( ; it != dlist.end(); ++it )
shm->initIterator(it->ioit);
for( auto&& it: dlist )
shm->initIterator(it.ioit);
}
// -----------------------------------------------------------------------------
void UNetSender::askSensors( UniversalIO::UIOCommand cmd )
{
auto it = dlist.begin();
for( ; it != dlist.end(); ++it )
shm->askSensor(it->id, cmd);
for( auto&& it: dlist )
shm->askSensor(it.id, cmd);
}
// -----------------------------------------------------------------------------
......@@ -17,7 +17,7 @@
/*
* ОПТИМИЗАЦИЯ N1: Для оптимизации обработки посылаемых пакетов (на стороне UNetReceiver) следана следующая логика:
* Номер очередного посылаемого пакета меняется (увеличивается) только, если изменились данные с момента
последней посылки. Для по данным каждый раз производится расчёт UNetUDP::makeCRC() и сравнивается с последним..
последней посылки. Для этого по данным каждый раз производится расчёт UNetUDP::makeCRC() и сравнивается с последним..
*/
class UNetSender
{
......
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