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