Commit 59ef36ea authored by Pavel Vainerman's avatar Pavel Vainerman

(UNetUDP): исправлена ошибка переключения каналов (спасибо Alexey Surov)

parent b4ed97c3
......@@ -8,7 +8,7 @@
Name: libuniset
Version: 1.8
Release: alt4
Release: alt5
Summary: UniSet - library for building distributed industrial control systems
License: GPL
......@@ -339,8 +339,11 @@ mv -f %buildroot%python_sitelibdir_noarch/* %buildroot%python_sitelibdir/%oname
%changelog
* Thu Mar 19 2015 Pavel Vainerman <pv@altlinux.ru> 1.8-alt5
- unetudp: fxied critial bug in "switching channels" (thank`s Alexey Surov)
* Fri Mar 13 2015 Pavel Vainerman <pv@altlinux.ru> 1.8-alt4
- unetudp: minor optimization (thank`s uzum)
- unetudp: minor optimization (thank`s thank`s Alexey Vinogradov)
* Sun Mar 01 2015 Pavel Vainerman <pv@altlinux.ru> 1.8-alt3
- ModbusMaster: fixed bug in initialization (close setbug #5583)
......
......@@ -737,40 +737,84 @@ UNetExchange* UNetExchange::init_unetexchange( int argc, const char* argv[], Uni
// -----------------------------------------------------------------------------
void UNetExchange::receiverEvent( UNetReceiver* r, UNetReceiver::Event ev )
{
// пока, что другие события нас не интересуют
if( ev != UNetReceiver::evTimeout )
return;
for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it )
{
if( it->r1 == r )
{
// если нет второго канала
// то и переключать некуда
if( !it->r2 )
return;
// пропала связь по первому каналу...
// переключаемся на второй
it->r1->setLockUpdate(true);
it->r2->setLockUpdate(false);
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(event): " << r->getName()
if( ev == UNetReceiver::evTimeout )
{
// если нет второго канала или нет связи
// то и переключать не надо
if( !it->r2 || !it->r2->isRecvOK() )
return;
// пропала связь по первому каналу...
// переключаемся на второй
it->r1->setLockUpdate(true);
it->r2->setLockUpdate(false);
if( dlog.debugging(Debug::LEVEL8) )
dlog[Debug::INFO] << myname << "(event): " << r->getName()
<< ": timeout for channel1.. select channel 2" << endl;
}
else if( ev == UNetReceiver::evOK )
{
// если связь восстановилась..
// проверяем, а что там со вторым каналом
// если у него связи нет, то забираем себе..
if( !it->r2 || !it->r2->isRecvOK() )
{
it->r1->setLockUpdate(false);
if( it->r2 )
it->r2->setLockUpdate(true);
if( dlog.debugging(Debug::LEVEL8) )
dlog[Debug::LEVEL8] << "(event): " << r->getName()
<< ": link failed for channel2.. select again channel1.." << endl;
}
}
return;
}
if( it->r2 == r )
{
// пропала связь по второму каналу...
// переключаемся на первый
it->r1->setLockUpdate(false);
it->r2->setLockUpdate(true);
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(event): " << r->getName()
<< ": timeout for channel2.. select channel 1" << endl;
if( ev == UNetReceiver::evTimeout )
{
// если первого канала нет или нет связи
// то и переключать не надо
if( !it->r1 || !it->r1->isRecvOK() )
return;
// пропала связь по второму каналу...
// переключаемся на первый
it->r1->setLockUpdate(false);
it->r2->setLockUpdate(true);
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(event): " << r->getName()
<< ": timeout for channel2.. select channel 1" << endl;
return;
}
else if( ev == UNetReceiver::evOK )
{
// если связь восстановилась..
// проверяем, а что там со первым каналом
// если у него связи нет, то забираем себе..
if( !it->r1 || !it->r1->isRecvOK() )
{
if( it->r1 )
it->r1->setLockUpdate(true);
it->r2->setLockUpdate(false);
if( dlog.debugging(Debug::LEVEL8) )
dlog[Debug::LEVEL8] << myname << "(event): " << r->getName()
<< ": link failed for channel1.. select again channel2.." << endl;
}
}
return;
}
}
......
......@@ -51,7 +51,7 @@ class UNetReceiver
{
public:
UNetReceiver( const std::string& host, const ost::tpport_t port, SMInterface* smi );
~UNetReceiver();
virtual ~UNetReceiver();
void start();
void stop();
......
......@@ -22,7 +22,7 @@ class UNetSender
UNetSender( const std::string host, const ost::tpport_t port, SMInterface* smi,
const std::string s_field="", const std::string s_fvalue="", SharedMemory* ic=0 );
~UNetSender();
virtual ~UNetSender();
struct UItem
{
......
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