Commit c6bb5036 authored by Pavel Vainerman's avatar Pavel Vainerman

(IONotifyController): попытка исправить ошибку в сохранении данных в SM

parent 2f1a95bb
......@@ -140,16 +140,16 @@ long IOController::localGetValue( IOController::IOStateList::iterator& li, const
throw IOController_i::NameNotFound(err.str().c_str());
}
// ------------------------------------------------------------------------------------------
long IOController::localGetValue( std::shared_ptr<USensorInfo>& li, const UniSetTypes::ObjectId sid )
long IOController::localGetValue( std::shared_ptr<USensorInfo>& usi, const UniSetTypes::ObjectId sid )
{
if( li )
if( usi )
{
uniset_rwmutex_rlock lock(li->val_lock);
uniset_rwmutex_rlock lock(usi->val_lock);
if( li->undefined )
if( usi->undefined )
throw IOController_i::Undefined();
return li->value;
return usi->value;
}
// -------------
......@@ -299,7 +299,7 @@ void IOController::localSetValue( std::shared_ptr<USensorInfo>& usi,
<< " real_value=" << usi->real_value
<< endl;
long prev = usi->value;
CORBA::Long prev = usi->value;
if( blocked )
{
......@@ -315,7 +315,7 @@ void IOController::localSetValue( std::shared_ptr<USensorInfo>& usi,
changed = ( prev != usi->value );
// запоминаем время изменения
struct timeval tm;
struct timeval tm = { 0 };
struct timezone tz;
tm.tv_sec = 0;
tm.tv_usec = 0;
......@@ -638,12 +638,12 @@ void IOController::USensorInfo::init( const IOController_i::SensorIOInfo& s )
(*this) = std::move(r);
}
// ----------------------------------------------------------------------------------------
bool IOController::checkIOFilters( std::shared_ptr<USensorInfo>& ai, CORBA::Long& newvalue,
bool IOController::checkIOFilters( std::shared_ptr<USensorInfo>& usi, CORBA::Long& newvalue,
UniSetTypes::ObjectId sup_id )
{
for( const auto& it : iofilters )
{
if( it(ai, newvalue, sup_id) == false )
if( it(usi, newvalue, sup_id) == false )
return false;
}
......
......@@ -266,10 +266,10 @@ void IONotifyController::ask( AskMap& askLst, const UniSetTypes::ObjectId sid,
}
}
// ------------------------------------------------------------------------------------------
bool IONotifyController::myIOFilter( std::shared_ptr<USensorInfo>& ai,
bool IONotifyController::myIOFilter( std::shared_ptr<USensorInfo>& usi,
CORBA::Long newvalue, UniSetTypes::ObjectId sup_id )
{
if( ai->value == newvalue )
if( usi->value == newvalue )
return false;
return true;
......@@ -279,23 +279,24 @@ void IONotifyController::localSetValue( std::shared_ptr<IOController::USensorInf
UniSetTypes::ObjectId sid,
CORBA::Long value, UniSetTypes::ObjectId sup_id )
{
long prevValue = 0;
CORBA::Long prevValue = 0;
try
{
// Если датчик не найден сдесь сработает исключение
// Если датчик не найден здесь сработает исключение
prevValue = IOController::localGetValue( usi, sid );
}
catch( IOController_i::Undefined )
{
// чтобы сработало prevValue!=value
// чтобы сработало prevValue != usi->value
// искусственно меняем значение
prevValue = value + 1;
uniset_rwmutex_rlock lock(usi->val_lock);
prevValue = usi->value + 1;
}
IOController::localSetValue(usi, sid, value, sup_id);
// сравниваем именно с li->second->value
// сравниваем именно с usi->value
// т.к. фактическое сохранённое значение может быть изменено
// фильтрами или блокировками..
SensorMessage sm(sid, usi->value);
......@@ -483,7 +484,7 @@ void IONotifyController::askThreshold(UniSetTypes::ObjectId sid, const UniSetTyp
// если такого дискретного датчика нет сдесь сработает исключение...
auto li = myioEnd();
long val = 0;
CORBA::Long val = 0;
try
{
......
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