Commit e785f068 authored by Pavel Vainerman's avatar Pavel Vainerman

Перешёл где можно от mutex к atomic.

parent 0a0b2351
...@@ -234,7 +234,7 @@ ...@@ -234,7 +234,7 @@
inline const std::string getProp(const std::string& name) { return UniSetTypes::conf->getProp(confnode, name); } inline const std::string getProp(const std::string& name) { return UniSetTypes::conf->getProp(confnode, name); }
int smReadyTimeout; /*!< время ожидания готовности SM */ int smReadyTimeout; /*!< время ожидания готовности SM */
bool activated; UniSetTypes::mutex_atomic_t activated;
int activateTimeout; /*!< время ожидания готовности UniSetObject к работе */ int activateTimeout; /*!< время ожидания готовности UniSetObject к работе */
PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */ PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */
int askPause; /*!< пауза между неудачными попытками заказать датчики */ int askPause; /*!< пауза между неудачными попытками заказать датчики */
...@@ -350,10 +350,10 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::activateObject() ...@@ -350,10 +350,10 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::activateObject()
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
activated = false; activated = 0;
<xsl:if test="normalize-space($BASECLASS)!=''"><xsl:value-of select="normalize-space($BASECLASS)"/>::activateObject();</xsl:if> <xsl:if test="normalize-space($BASECLASS)!=''"><xsl:value-of select="normalize-space($BASECLASS)"/>::activateObject();</xsl:if>
<xsl:if test="normalize-space($BASECLASS)=''">UniSetObject::activateObject();</xsl:if> <xsl:if test="normalize-space($BASECLASS)=''">UniSetObject::activateObject();</xsl:if>
activated = true; activated = 1;
} }
return true; return true;
...@@ -522,7 +522,7 @@ idHeartBeat(DefaultObjectId), ...@@ -522,7 +522,7 @@ idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(0), confnode(0),
smReadyTimeout(0), smReadyTimeout(0),
activated(false), activated(0),
askPause(2000), askPause(2000),
<xsl:for-each select="//variables/item"> <xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@private)!=''"> <xsl:if test="normalize-space(@private)!=''">
...@@ -586,7 +586,7 @@ idHeartBeat(DefaultObjectId), ...@@ -586,7 +586,7 @@ idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(cnode), confnode(cnode),
smReadyTimeout(0), smReadyTimeout(0),
activated(false), activated(0),
askPause(conf->getPIntProp(cnode,"askPause",2000)), askPause(conf->getPIntProp(cnode,"askPause",2000)),
<xsl:for-each select="//variables/item"> <xsl:for-each select="//variables/item">
<xsl:if test="normalize-space(@private)!=''"> <xsl:if test="normalize-space(@private)!=''">
...@@ -872,7 +872,7 @@ idLocalTestMode_S(DefaultObjectId), ...@@ -872,7 +872,7 @@ idLocalTestMode_S(DefaultObjectId),
idHeartBeat(DefaultObjectId), idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(0), confnode(0),
activated(false), activated(0),
askPause(2000) askPause(2000)
{ {
ucrit &lt;&lt; "<xsl:value-of select="$CLASSNAME"/>: init failed!!!!!!!!!!!!!!!" &lt;&lt; endl; ucrit &lt;&lt; "<xsl:value-of select="$CLASSNAME"/>: init failed!!!!!!!!!!!!!!!" &lt;&lt; endl;
...@@ -906,7 +906,7 @@ in_LocalTestMode_S(false), ...@@ -906,7 +906,7 @@ in_LocalTestMode_S(false),
idHeartBeat(DefaultObjectId), idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(cnode), confnode(cnode),
activated(false), activated(0),
askPause(conf->getPIntProp(cnode,"askPause",2000)) askPause(conf->getPIntProp(cnode,"askPause",2000))
{ {
if( getId() == DefaultObjectId ) if( getId() == DefaultObjectId )
......
noinst_PROGRAMS = test test2 noinst_PROGRAMS = test test2
#test2 #test2
test_LDADD = $(top_builddir)/lib/libUniSet.la test_LDADD = $(top_builddir)/lib/libUniSet.la $(COMCPP_LIBS)
test_CXXFLAGS = -I$(top_builddir)/include test_CXXFLAGS = -I$(top_builddir)/include $(COMCPP_CGLAGS)
test_SOURCES = TestGen_SK.cc TestGen.cc TestGen-main.cc test_SOURCES = TestGen_SK.cc TestGen.cc TestGen-main.cc
test2_LDADD = $(top_builddir)/lib/libUniSet.la test2_LDADD = $(top_builddir)/lib/libUniSet.la $(COMCPP_LIBS)
test2_CXXFLAGS = -I$(top_builddir)/include test2_CXXFLAGS = -I$(top_builddir)/include $(COMCPP_CGLAGS)
test2_SOURCES = TestGenAlone_SK.cc TestGenAlone.cc TestGenAlone-main.cc test2_SOURCES = TestGenAlone_SK.cc TestGenAlone.cc TestGenAlone-main.cc
GENERATED=TestGen_SK.h TestGen_SK.cc TestGen-main.cc GENERATED=TestGen_SK.h TestGen_SK.cc TestGen-main.cc
......
...@@ -14,10 +14,10 @@ std::ostream& operator<<( std::ostream& os, IOControl::IOInfo& inf ) ...@@ -14,10 +14,10 @@ std::ostream& operator<<( std::ostream& os, IOControl::IOInfo& inf )
<< " card=" << inf.ncard << " channel=" << inf.channel << " subdev=" << inf.subdev << " card=" << inf.ncard << " channel=" << inf.channel << " subdev=" << inf.subdev
<< " aref=" << inf.aref << " range=" << inf.range << " aref=" << inf.aref << " range=" << inf.range
<< " default=" << inf.defval << " safety=" << inf.safety; << " default=" << inf.defval << " safety=" << inf.safety;
if( inf.cal.minRaw!=inf.cal.maxRaw ) if( inf.cal.minRaw!=inf.cal.maxRaw )
os << inf.cal; os << inf.cal;
return os; return os;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -43,7 +43,7 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID, ...@@ -43,7 +43,7 @@ IOControl::IOControl( UniSetTypes::ObjectId id, UniSetTypes::ObjectId icID,
force(false), force(false),
force_out(false), force_out(false),
maxCardNum(10), maxCardNum(10),
activated(false), activated(0),
readconf_ok(false), readconf_ok(false),
term(false), term(false),
testMode_as(UniSetTypes::DefaultObjectId), testMode_as(UniSetTypes::DefaultObjectId),
...@@ -295,7 +295,7 @@ void IOControl::execute() ...@@ -295,7 +295,7 @@ void IOControl::execute()
PassiveTimer ptAct(activateTimeout); PassiveTimer ptAct(activateTimeout);
while( !activated && !ptAct.checkTime() ) while( !activated && !ptAct.checkTime() )
{ {
cout << myname << "(execute): wait activate..." << endl; cout << myname << "(execute): wait activate..." << endl;
msleep(300); msleep(300);
if( activated ) if( activated )
...@@ -783,9 +783,9 @@ bool IOControl::activateObject() ...@@ -783,9 +783,9 @@ bool IOControl::activateObject()
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
activated = false; activated = 0;
UniSetObject::activateObject(); UniSetObject::activateObject();
activated = true; activated = 1;
} }
return true; return true;
...@@ -1162,7 +1162,7 @@ void IOControl::sysCommand( const SystemMessage* sm ) ...@@ -1162,7 +1162,7 @@ void IOControl::sysCommand( const SystemMessage* sm )
{ {
PassiveTimer ptAct(activateTimeout); PassiveTimer ptAct(activateTimeout);
while( !activated && !ptAct.checkTime() ) while( !activated && !ptAct.checkTime() )
{ {
dinfo << myname << "(sysCommand): wait activate..." << endl; dinfo << myname << "(sysCommand): wait activate..." << endl;
msleep(300); msleep(300);
if( activated ) if( activated )
......
...@@ -370,7 +370,7 @@ class IOControl: ...@@ -370,7 +370,7 @@ class IOControl:
int maxCardNum; /*! максимально разрешённый номер для карты */ int maxCardNum; /*! максимально разрешённый номер для карты */
UniSetTypes::uniset_mutex iopollMutex; UniSetTypes::uniset_mutex iopollMutex;
bool activated; UniSetTypes::mutex_atomic_t activated;
bool readconf_ok; bool readconf_ok;
int activateTimeout; int activateTimeout;
UniSetTypes::ObjectId sidTestSMReady; UniSetTypes::ObjectId sidTestSMReady;
......
...@@ -22,7 +22,7 @@ force_out(false), ...@@ -22,7 +22,7 @@ force_out(false),
mbregFromID(false), mbregFromID(false),
sidExchangeMode(DefaultObjectId), sidExchangeMode(DefaultObjectId),
exchangeMode(emNone), exchangeMode(emNone),
activated(false), activated(0),
noQueryOptimization(false), noQueryOptimization(false),
no_extimer(false), no_extimer(false),
prefix(prefix), prefix(prefix),
...@@ -221,14 +221,12 @@ void MBExchange::step() ...@@ -221,14 +221,12 @@ void MBExchange::step()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBExchange::checkProcActive() bool MBExchange::checkProcActive()
{ {
uniset_rwmutex_rlock l(actMutex);
return activated; return activated;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBExchange::setProcActive( bool st ) void MBExchange::setProcActive( bool st )
{ {
uniset_rwmutex_wrlock l(actMutex); activated = (st ? 1 : 0);
activated = st;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBExchange::sigterm( int signo ) void MBExchange::sigterm( int signo )
...@@ -2406,15 +2404,15 @@ void MBExchange::sysCommand( const UniSetTypes::SystemMessage *sm ) ...@@ -2406,15 +2404,15 @@ void MBExchange::sysCommand( const UniSetTypes::SystemMessage *sm )
// см. activateObject() // см. activateObject()
msleep(initPause); msleep(initPause);
PassiveTimer ptAct(activateTimeout); PassiveTimer ptAct(activateTimeout);
while( !activated && !ptAct.checkTime() ) while( !checkProcActive() && !ptAct.checkTime() )
{ {
cout << myname << "(sysCommand): wait activate..." << endl; cout << myname << "(sysCommand): wait activate..." << endl;
msleep(300); msleep(300);
if( activated ) if( checkProcActive() )
break; break;
} }
if( !activated ) if( !checkProcActive() )
dcrit << myname << "(sysCommand): ************* don`t activate?! ************" << endl; dcrit << myname << "(sysCommand): ************* don`t activate?! ************" << endl;
{ {
UniSetTypes::uniset_rwmutex_rlock l(mutex_start); UniSetTypes::uniset_rwmutex_rlock l(mutex_start);
...@@ -2432,7 +2430,7 @@ void MBExchange::sysCommand( const UniSetTypes::SystemMessage *sm ) ...@@ -2432,7 +2430,7 @@ void MBExchange::sysCommand( const UniSetTypes::SystemMessage *sm )
case SystemMessage::Finish: case SystemMessage::Finish:
askSensors(UniversalIO::UIODontNotify); askSensors(UniversalIO::UIODontNotify);
break; break;
case SystemMessage::WatchDog: case SystemMessage::WatchDog:
{ {
// ОПТИМИЗАЦИЯ (защита от двойного перезаказа при старте) // ОПТИМИЗАЦИЯ (защита от двойного перезаказа при старте)
...@@ -2695,7 +2693,7 @@ void MBExchange::poll() ...@@ -2695,7 +2693,7 @@ void MBExchange::poll()
if( d->resp_real ) if( d->resp_real )
allNotRespond = false; allNotRespond = false;
if( it==d->regmap.end() ) if( it==d->regmap.end() )
break; break;
...@@ -2724,7 +2722,7 @@ void MBExchange::poll() ...@@ -2724,7 +2722,7 @@ void MBExchange::poll()
// update SharedMemory... // update SharedMemory...
updateSM(); updateSM();
// check thresholds // check thresholds
for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 ) for( MBExchange::RTUDeviceMap::iterator it1=rmap.begin(); it1!=rmap.end(); ++it1 )
{ {
......
...@@ -298,8 +298,7 @@ class MBExchange: ...@@ -298,8 +298,7 @@ class MBExchange:
IOController::IOStateList::iterator itExchangeMode; IOController::IOStateList::iterator itExchangeMode;
long exchangeMode; /*!< режим работы см. ExchangeMode */ long exchangeMode; /*!< режим работы см. ExchangeMode */
UniSetTypes::uniset_rwmutex actMutex; UniSetTypes::mutex_atomic_t activated;
bool activated;
int activateTimeout; int activateTimeout;
bool noQueryOptimization; bool noQueryOptimization;
bool no_extimer; bool no_extimer;
......
...@@ -22,7 +22,7 @@ askcount_id(DefaultObjectId), ...@@ -22,7 +22,7 @@ askcount_id(DefaultObjectId),
respond_id(DefaultObjectId), respond_id(DefaultObjectId),
respond_invert(false), respond_invert(false),
askCount(0), askCount(0),
activated(false), activated(0),
activateTimeout(500), activateTimeout(500),
pingOK(true), pingOK(true),
force(false), force(false),
...@@ -549,7 +549,7 @@ void MBSlave::sysCommand( const UniSetTypes::SystemMessage *sm ) ...@@ -549,7 +549,7 @@ void MBSlave::sysCommand( const UniSetTypes::SystemMessage *sm )
msleep(initPause); msleep(initPause);
PassiveTimer ptAct(activateTimeout); PassiveTimer ptAct(activateTimeout);
while( !activated && !ptAct.checkTime() ) while( !activated && !ptAct.checkTime() )
{ {
cout << myname << "(sysCommand): wait activate..." << endl; cout << myname << "(sysCommand): wait activate..." << endl;
msleep(300); msleep(300);
if( activated ) if( activated )
...@@ -557,9 +557,9 @@ void MBSlave::sysCommand( const UniSetTypes::SystemMessage *sm ) ...@@ -557,9 +557,9 @@ void MBSlave::sysCommand( const UniSetTypes::SystemMessage *sm )
} }
if( !activated ) if( !activated )
{ {
dcrit << myname << "(sysCommand): ************* don`t activate?! ************" << endl; dcrit << myname << "(sysCommand): ************* don`t activate?! ************" << endl;
} }
else else
{ {
UniSetTypes::uniset_rwmutex_rlock l(mutex_start); UniSetTypes::uniset_rwmutex_rlock l(mutex_start);
...@@ -699,11 +699,11 @@ bool MBSlave::activateObject() ...@@ -699,11 +699,11 @@ bool MBSlave::activateObject()
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
activated = false; activated = 0;
UniSetTypes::uniset_rwmutex_wrlock l(mutex_start); UniSetTypes::uniset_rwmutex_wrlock l(mutex_start);
UniSetObject_LT::activateObject(); UniSetObject_LT::activateObject();
initIterators(); initIterators();
activated = true; activated = 1;
} }
return true; return true;
...@@ -711,8 +711,8 @@ bool MBSlave::activateObject() ...@@ -711,8 +711,8 @@ bool MBSlave::activateObject()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void MBSlave::sigterm( int signo ) void MBSlave::sigterm( int signo )
{ {
cerr << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; dinfo << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
activated = false; activated = 0;
try try
{ {
if( mbslot ) if( mbslot )
......
...@@ -25,7 +25,7 @@ class MBSlave: ...@@ -25,7 +25,7 @@ class MBSlave:
public: public:
MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, std::string prefix="mbs" ); MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, std::string prefix="mbs" );
virtual ~MBSlave(); virtual ~MBSlave();
/*! глобальная функция для инициализации объекта */ /*! глобальная функция для инициализации объекта */
static MBSlave* init_mbslave( int argc, const char* const* argv, static MBSlave* init_mbslave( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0, UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
...@@ -66,58 +66,58 @@ class MBSlave: ...@@ -66,58 +66,58 @@ class MBSlave:
protected: protected:
/*! обработка 0x01 */ /*! обработка 0x01 */
ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query, ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
ModbusRTU::ReadCoilRetMessage& reply ); ModbusRTU::ReadCoilRetMessage& reply );
/*! обработка 0x02 */ /*! обработка 0x02 */
ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query, ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
ModbusRTU::ReadInputStatusRetMessage& reply ); ModbusRTU::ReadInputStatusRetMessage& reply );
/*! обработка 0x03 */ /*! обработка 0x03 */
ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query, ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
ModbusRTU::ReadOutputRetMessage& reply ); ModbusRTU::ReadOutputRetMessage& reply );
/*! обработка 0x04 */ /*! обработка 0x04 */
ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query, ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
ModbusRTU::ReadInputRetMessage& reply ); ModbusRTU::ReadInputRetMessage& reply );
/*! обработка 0x05 */ /*! обработка 0x05 */
ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query, ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
ModbusRTU::ForceSingleCoilRetMessage& reply ); ModbusRTU::ForceSingleCoilRetMessage& reply );
/*! обработка 0x0F */ /*! обработка 0x0F */
ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query, ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
ModbusRTU::ForceCoilsRetMessage& reply ); ModbusRTU::ForceCoilsRetMessage& reply );
/*! обработка 0x10 */ /*! обработка 0x10 */
ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query, ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
ModbusRTU::WriteOutputRetMessage& reply ); ModbusRTU::WriteOutputRetMessage& reply );
/*! обработка 0x06 */ /*! обработка 0x06 */
ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
ModbusRTU::WriteSingleOutputRetMessage& reply ); ModbusRTU::WriteSingleOutputRetMessage& reply );
/*! обработка запросов на чтение ошибок */ /*! обработка запросов на чтение ошибок */
// ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, // ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
// ModbusRTU::JournalCommandRetMessage& reply ); // ModbusRTU::JournalCommandRetMessage& reply );
/*! обработка запроса на установку времени */ /*! обработка запроса на установку времени */
ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query, ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
ModbusRTU::SetDateTimeRetMessage& reply ); ModbusRTU::SetDateTimeRetMessage& reply );
/*! обработка запроса удалённого сервиса */ /*! обработка запроса удалённого сервиса */
ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query, ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
ModbusRTU::RemoteServiceRetMessage& reply ); ModbusRTU::RemoteServiceRetMessage& reply );
ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
ModbusRTU::FileTransferRetMessage& reply ); ModbusRTU::FileTransferRetMessage& reply );
ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query, ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply ); ModbusRTU::DiagnosticRetMessage& reply );
ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query, ModbusRTU::mbErrCode read4314( ModbusRTU::MEIMessageRDI& query,
ModbusRTU::MEIMessageRetRDI& reply ); ModbusRTU::MEIMessageRetRDI& reply );
/*! Проверка корректности регистра перед сохранением. /*! Проверка корректности регистра перед сохранением.
Вызывается для каждого регистра не зависимо от используемой функции (06 или 10) Вызывается для каждого регистра не зависимо от используемой функции (06 или 10)
*/ */
...@@ -161,7 +161,7 @@ class MBSlave: ...@@ -161,7 +161,7 @@ class MBSlave:
ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val ); ModbusRTU::mbErrCode real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count ); ModbusRTU::mbErrCode much_real_read( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count ); ModbusRTU::mbErrCode much_real_write( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData* dat, int count );
ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val ); ModbusRTU::mbErrCode real_read_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData& val ); ModbusRTU::mbErrCode real_write_it( IOMap::iterator& it, ModbusRTU::ModbusData& val );
private: private:
...@@ -189,7 +189,7 @@ class MBSlave: ...@@ -189,7 +189,7 @@ class MBSlave:
typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap; typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap;
ExchangeErrorMap errmap; /*!< статистика обмена */ ExchangeErrorMap errmap; /*!< статистика обмена */
bool activated; UniSetTypes::mutex_atomic_t activated;
int activateTimeout; int activateTimeout;
bool pingOK; bool pingOK;
timeout_t wait_msec; timeout_t wait_msec;
......
...@@ -11,7 +11,7 @@ UNetExchange::UNetExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId s ...@@ -11,7 +11,7 @@ UNetExchange::UNetExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId s
UniSetObject_LT(objId), UniSetObject_LT(objId),
shm(0), shm(0),
initPause(0), initPause(0),
activated(false), activated(0),
no_sender(false), no_sender(false),
sender(0), sender(0),
sender2(0) sender2(0)
...@@ -473,7 +473,7 @@ void UNetExchange::sysCommand( const UniSetTypes::SystemMessage *sm ) ...@@ -473,7 +473,7 @@ void UNetExchange::sysCommand( const UniSetTypes::SystemMessage *sm )
msleep(initPause); msleep(initPause);
PassiveTimer ptAct(activateTimeout); PassiveTimer ptAct(activateTimeout);
while( !activated && !ptAct.checkTime() ) while( !activated && !ptAct.checkTime() )
{ {
cout << myname << "(sysCommand): wait activate..." << endl; cout << myname << "(sysCommand): wait activate..." << endl;
msleep(300); msleep(300);
if( activated ) if( activated )
...@@ -576,11 +576,11 @@ bool UNetExchange::activateObject() ...@@ -576,11 +576,11 @@ bool UNetExchange::activateObject()
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
activated = false; activated = 0;
UniSetTypes::uniset_rwmutex_wrlock l(mutex_start); UniSetTypes::uniset_rwmutex_wrlock l(mutex_start);
UniSetObject_LT::activateObject(); UniSetObject_LT::activateObject();
initIterators(); initIterators();
activated = true; activated = 1;
} }
return true; return true;
...@@ -589,7 +589,7 @@ bool UNetExchange::activateObject() ...@@ -589,7 +589,7 @@ bool UNetExchange::activateObject()
void UNetExchange::sigterm( int signo ) void UNetExchange::sigterm( int signo )
{ {
dinfo << myname << ": ********* SIGTERM(" << signo <<") ********" << endl; dinfo << myname << ": ********* SIGTERM(" << signo <<") ********" << endl;
activated = false; activated = 0;
for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it ) for( ReceiverList::iterator it=recvlist.begin(); it!=recvlist.end(); ++it )
{ {
try try
......
...@@ -134,7 +134,7 @@ class UNetExchange: ...@@ -134,7 +134,7 @@ class UNetExchange:
int steptime; /*!< периодичность вызова step, [мсек] */ int steptime; /*!< периодичность вызова step, [мсек] */
bool activated; UniSetTypes::mutex_atomic_t activated;
int activateTimeout; int activateTimeout;
struct ReceiverInfo struct ReceiverInfo
......
...@@ -31,7 +31,7 @@ lostPackets(0), ...@@ -31,7 +31,7 @@ lostPackets(0),
sidRespond(UniSetTypes::DefaultObjectId), sidRespond(UniSetTypes::DefaultObjectId),
respondInvert(false), respondInvert(false),
sidLostPackets(UniSetTypes::DefaultObjectId), sidLostPackets(UniSetTypes::DefaultObjectId),
activated(false), activated(0),
r_thr(0), r_thr(0),
u_thr(0), u_thr(0),
pnum(0), pnum(0),
...@@ -160,7 +160,7 @@ void UNetReceiver::start() ...@@ -160,7 +160,7 @@ void UNetReceiver::start()
{ {
if( !activated ) if( !activated )
{ {
activated = true; activated = 1;
u_thr->start(); u_thr->start();
r_thr->start(); r_thr->start();
} }
...@@ -348,10 +348,7 @@ void UNetReceiver::real_update() ...@@ -348,10 +348,7 @@ void UNetReceiver::real_update()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetReceiver::stop() void UNetReceiver::stop()
{ {
activated = false; activated = 0;
// msleep(10);
// u_thr->stop();
// r_thr->stop();
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetReceiver::receive() void UNetReceiver::receive()
......
...@@ -84,7 +84,7 @@ class UNetReceiver ...@@ -84,7 +84,7 @@ class UNetReceiver
inline ost::IPV4Address getAddress(){ return addr; } inline ost::IPV4Address getAddress(){ return addr; }
inline ost::tpport_t getPort(){ return port; } inline ost::tpport_t getPort(){ return port; }
/*! Коды событий */ /*! Коды событий */
enum Event enum Event
{ {
evOK, /*!< связь есть */ evOK, /*!< связь есть */
...@@ -130,7 +130,7 @@ class UNetReceiver ...@@ -130,7 +130,7 @@ class UNetReceiver
UniSetTypes::ObjectId sidLostPackets; UniSetTypes::ObjectId sidLostPackets;
IOController::IOStateList::iterator itLostPackets; IOController::IOStateList::iterator itLostPackets;
bool activated; UniSetTypes::mutex_atomic_t activated;
ThreadCreator<UNetReceiver>* r_thr; // receive thread ThreadCreator<UNetReceiver>* r_thr; // receive thread
ThreadCreator<UNetReceiver>* u_thr; // update thread ThreadCreator<UNetReceiver>* u_thr; // update thread
...@@ -158,12 +158,12 @@ class UNetReceiver ...@@ -158,12 +158,12 @@ class UNetReceiver
PacketQueue qtmp; /*!< очередь на время обработки(очистки) основной очереди */ PacketQueue qtmp; /*!< очередь на время обработки(очистки) основной очереди */
bool waitClean; /*!< флаг означающий, что ждём очистики очереди до конца */ bool waitClean; /*!< флаг означающий, что ждём очистики очереди до конца */
unsigned long rnum; /*!< текущий номер принятого сообщения, для проверки "переполнения" или "сбоя" счётчика */ unsigned long rnum; /*!< текущий номер принятого сообщения, для проверки "переполнения" или "сбоя" счётчика */
int maxProcessingCount; /*!< максимальное число обрабатываемых за один раз сообщений */ int maxProcessingCount; /*!< максимальное число обрабатываемых за один раз сообщений */
bool lockUpdate; /*!< флаг блокировки сохранения принятых данных в SM */ bool lockUpdate; /*!< флаг блокировки сохранения принятых данных в SM */
UniSetTypes::uniset_rwmutex lockMutex; UniSetTypes::uniset_rwmutex lockMutex;
EventSlot slEvent; EventSlot slEvent;
Trigger trTimeout; Trigger trTimeout;
UniSetTypes::uniset_rwmutex tmMutex; UniSetTypes::uniset_rwmutex tmMutex;
......
...@@ -15,7 +15,7 @@ s_fvalue(s_val), ...@@ -15,7 +15,7 @@ s_fvalue(s_val),
shm(smi), shm(smi),
s_host(s_host), s_host(s_host),
sendpause(150), sendpause(150),
activated(false), activated(0),
dlist(100), dlist(100),
maxItem(0), maxItem(0),
packetnum(1), packetnum(1),
...@@ -195,7 +195,7 @@ void UNetSender::real_send() ...@@ -195,7 +195,7 @@ void UNetSender::real_send()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void UNetSender::stop() void UNetSender::stop()
{ {
activated = false; activated = 0;
// s_thr->stop(); // s_thr->stop();
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -203,7 +203,7 @@ void UNetSender::start() ...@@ -203,7 +203,7 @@ void UNetSender::start()
{ {
if( !activated ) if( !activated )
{ {
activated = true; activated = 1;
s_thr->start(); s_thr->start();
} }
} }
......
...@@ -23,7 +23,7 @@ class UNetSender ...@@ -23,7 +23,7 @@ class UNetSender
const std::string& s_field="", const std::string& s_fvalue="", SharedMemory* ic=0 ); const std::string& s_field="", const std::string& s_fvalue="", SharedMemory* ic=0 );
~UNetSender(); ~UNetSender();
struct UItem struct UItem
{ {
UItem(): UItem():
...@@ -38,7 +38,7 @@ class UNetSender ...@@ -38,7 +38,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::vector<UItem> DMap;
void start(); void start();
...@@ -46,7 +46,7 @@ class UNetSender ...@@ -46,7 +46,7 @@ class UNetSender
void send(); void send();
void real_send(); void real_send();
/*! (принудительно) обновить все данные (из SM) */ /*! (принудительно) обновить все данные (из SM) */
void updateFromSM(); void updateFromSM();
...@@ -57,7 +57,7 @@ class UNetSender ...@@ -57,7 +57,7 @@ class UNetSender
void updateItem( DMap::iterator& it, long value ); void updateItem( DMap::iterator& it, long value );
inline void setSendPause( int msec ){ sendpause = msec; } inline void setSendPause( int msec ){ sendpause = msec; }
/*! заказать датчики */ /*! заказать датчики */
void askSensors( UniversalIO::UIOCommand cmd ); void askSensors( UniversalIO::UIOCommand cmd );
...@@ -86,7 +86,7 @@ class UNetSender ...@@ -86,7 +86,7 @@ class UNetSender
std::string myname; std::string myname;
int sendpause; int sendpause;
bool activated; UniSetTypes::mutex_atomic_t activated;
UniSetTypes::uniset_rwmutex pack_mutex; UniSetTypes::uniset_rwmutex pack_mutex;
UniSetUDP::UDPMessage mypack; UniSetUDP::UDPMessage mypack;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2014-01-24+04:00 // generate timestamp: 2014-01-27+04:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#ifndef UObject_SK_H_ #ifndef UObject_SK_H_
#define UObject_SK_H_ #define UObject_SK_H_
...@@ -119,7 +119,7 @@ class UObject_SK: ...@@ -119,7 +119,7 @@ class UObject_SK:
inline const std::string getProp(const std::string& name) { return UniSetTypes::conf->getProp(confnode, name); } inline const std::string getProp(const std::string& name) { return UniSetTypes::conf->getProp(confnode, name); }
int smReadyTimeout; /*!< время ожидания готовности SM */ int smReadyTimeout; /*!< время ожидания готовности SM */
bool activated; UniSetTypes::mutex_atomic_t activated;
int activateTimeout; /*!< время ожидания готовности UniSetObject к работе */ int activateTimeout; /*!< время ожидания готовности UniSetObject к работе */
PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */ PassiveTimer ptStartUpTimeout; /*!< время на блокировку обработки WatchDog, если недавно был StartUp */
int askPause; /*!< пауза между неудачными попытками заказать датчики */ int askPause; /*!< пауза между неудачными попытками заказать датчики */
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ. ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/ */
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// generate timestamp: 2014-01-24+04:00 // generate timestamp: 2014-01-27+04:00
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include "Configuration.h" #include "Configuration.h"
#include "Exceptions.h" #include "Exceptions.h"
...@@ -38,7 +38,7 @@ idHeartBeat(DefaultObjectId), ...@@ -38,7 +38,7 @@ idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(0), confnode(0),
smReadyTimeout(0), smReadyTimeout(0),
activated(false), activated(0),
askPause(2000), askPause(2000),
end_private(false) end_private(false)
...@@ -73,7 +73,7 @@ idHeartBeat(DefaultObjectId), ...@@ -73,7 +73,7 @@ idHeartBeat(DefaultObjectId),
maxHeartBeat(10), maxHeartBeat(10),
confnode(cnode), confnode(cnode),
smReadyTimeout(0), smReadyTimeout(0),
activated(false), activated(0),
askPause(conf->getPIntProp(cnode,"askPause",2000)), askPause(conf->getPIntProp(cnode,"askPause",2000)),
end_private(false) end_private(false)
...@@ -297,9 +297,9 @@ bool UObject_SK::activateObject() ...@@ -297,9 +297,9 @@ bool UObject_SK::activateObject()
// пока не пройдёт инициализация датчиков // пока не пройдёт инициализация датчиков
// см. sysCommand() // см. sysCommand()
{ {
activated = false; activated = 0;
UniSetObject::activateObject(); UniSetObject::activateObject();
activated = true; activated = 1;
} }
return true; return true;
...@@ -360,7 +360,7 @@ void UObject_SK::callback() ...@@ -360,7 +360,7 @@ void UObject_SK::callback()
} }
// обработка сообщений (таймеров и т.п.) // обработка сообщений (таймеров и т.п.)
for( int i=0; i<20; i++ ) for( unsigned int i=0; i<20; i++ )
{ {
if( !receiveMessage(msg) ) if( !receiveMessage(msg) )
break; break;
......
noinst_PROGRAMS = smemory-test
smemory_test_LDADD = $(top_builddir)/lib/libUniSet.la \
$(top_builddir)/extensions/lib/libUniSetExtensions.la \
$(top_builddir)/extensions/SharedMemory/libUniSetSharedMemory.la \
$(SIGC_LIBS) $(COMCPP_LIBS)
smemory_test_CPPFLAGS = -I$(top_builddir)/include \
-I$(top_builddir)/extensions/include \
-I$(top_builddir)/extensions/SharedMemory \
$(SIGC_CFLAGS) $(COMCPP_CFLAGS)
smemory_test_SOURCES = TestProc_SK.cc TestProc.cc smemory-test.cc
TestProc_SK.cc: testproc.src.xml
# ./uniset-codegen --ask -n TestProc --local-include --topdir $(top_builddir)/ --no-main testproc.src.xml
$(top_builddir)/Utilities/codegen/@PACKAGE@-codegen -l $(top_builddir)/Utilities/codegen --ask -n TestProc --local-include --topdir $(top_builddir)/ --no-main testproc.src.xml
clean-local:
rm -rf *_SK.cc *_SK.h
...@@ -43,7 +43,7 @@ namespace UniSetTypes ...@@ -43,7 +43,7 @@ namespace UniSetTypes
{ {
public: public:
uniset_mutex(); uniset_mutex();
uniset_mutex( std::string name ); uniset_mutex( const std::string& name );
~uniset_mutex(); ~uniset_mutex();
bool isRelease(); bool isRelease();
...@@ -57,8 +57,8 @@ namespace UniSetTypes ...@@ -57,8 +57,8 @@ namespace UniSetTypes
private: private:
friend class uniset_mutex_lock; friend class uniset_mutex_lock;
uniset_mutex (const uniset_mutex& r); uniset_mutex (const uniset_mutex& r);
const uniset_mutex &operator=(const uniset_mutex& r); const uniset_mutex &operator=(const uniset_mutex& r);
omni_condition* cnd; omni_condition* cnd;
std::string nm; std::string nm;
omni_semaphore sem; omni_semaphore sem;
...@@ -85,7 +85,7 @@ namespace UniSetTypes ...@@ -85,7 +85,7 @@ namespace UniSetTypes
bool lock_ok(); bool lock_ok();
private: private:
uniset_mutex* mutex; uniset_mutex* mutex;
mutex_atomic_t mlock; mutex_atomic_t mlock;
uniset_mutex_lock(const uniset_mutex_lock&); uniset_mutex_lock(const uniset_mutex_lock&);
uniset_mutex_lock& operator=(const uniset_mutex_lock&); uniset_mutex_lock& operator=(const uniset_mutex_lock&);
...@@ -110,7 +110,7 @@ namespace UniSetTypes ...@@ -110,7 +110,7 @@ namespace UniSetTypes
bool tryrlock(); bool tryrlock();
bool trywrlock(); bool trywrlock();
uniset_rwmutex (const uniset_rwmutex& r); uniset_rwmutex( const uniset_rwmutex& r );
const uniset_rwmutex &operator=(const uniset_rwmutex& r); const uniset_rwmutex &operator=(const uniset_rwmutex& r);
inline std::string name(){ return nm; } inline std::string name(){ return nm; }
...@@ -121,7 +121,7 @@ namespace UniSetTypes ...@@ -121,7 +121,7 @@ namespace UniSetTypes
friend class uniset_rwmutex_lock; friend class uniset_rwmutex_lock;
ost::ThreadLock m; ost::ThreadLock m;
ost::AtomicCounter wr_wait; ost::AtomicCounter wr_wait;
static int num; static ost::AtomicCounter num;
}; };
std::ostream& operator<<(std::ostream& os, uniset_rwmutex& m ); std::ostream& operator<<(std::ostream& os, uniset_rwmutex& m );
......
...@@ -106,9 +106,9 @@ using namespace UniSetTypes; ...@@ -106,9 +106,9 @@ using namespace UniSetTypes;
UniSetTypes::IDList::IDList(): UniSetTypes::IDList::IDList():
node(UniSetTypes::conf->getLocalNode()) node(UniSetTypes::conf->getLocalNode())
{ {
} }
UniSetTypes::IDList::~IDList() UniSetTypes::IDList::~IDList()
{ {
} }
...@@ -120,11 +120,10 @@ using namespace UniSetTypes; ...@@ -120,11 +120,10 @@ using namespace UniSetTypes;
if( (*it) == id ) if( (*it) == id )
return; return;
} }
lst.push_back(id); lst.push_back(id);
} }
void UniSetTypes::IDList::del( ObjectId id ) void UniSetTypes::IDList::del( ObjectId id )
{ {
for( list<ObjectId>::iterator it=lst.begin(); it!=lst.end(); ++it ) for( list<ObjectId>::iterator it=lst.begin(); it!=lst.end(); ++it )
......
...@@ -41,8 +41,8 @@ uniset_mutex::uniset_mutex(): ...@@ -41,8 +41,8 @@ uniset_mutex::uniset_mutex():
cnd = new omni_condition(&mtx); cnd = new omni_condition(&mtx);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
uniset_mutex::uniset_mutex( string name ): uniset_mutex::uniset_mutex( const string& name ):
cnd(0), cnd(0),
nm(name), nm(name),
locked(0) locked(0)
{ {
...@@ -63,7 +63,6 @@ void uniset_mutex::lock() ...@@ -63,7 +63,6 @@ void uniset_mutex::lock()
{ {
sem.wait(); sem.wait();
locked = 1; locked = 1;
MUTEX_DEBUG(cerr << nm << " Locked.." << endl;) MUTEX_DEBUG(cerr << nm << " Locked.." << endl;)
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -154,7 +153,7 @@ wr_wait(0) ...@@ -154,7 +153,7 @@ wr_wait(0)
} }
int uniset_rwmutex::num = 0; ost::AtomicCounter uniset_rwmutex::num = 0;
uniset_rwmutex::uniset_rwmutex(): uniset_rwmutex::uniset_rwmutex():
nm(""), nm(""),
...@@ -181,7 +180,7 @@ const uniset_rwmutex &uniset_rwmutex::operator=( const uniset_rwmutex& r ) ...@@ -181,7 +180,7 @@ const uniset_rwmutex &uniset_rwmutex::operator=( const uniset_rwmutex& r )
nm = s.str(); nm = s.str();
unlock(); unlock();
} }
return *this; return *this;
} }
...@@ -193,25 +192,25 @@ nm(r.nm) ...@@ -193,25 +192,25 @@ nm(r.nm)
void uniset_rwmutex::lock() void uniset_rwmutex::lock()
{ {
MUTEX_DEBUG(cerr << nm << " prepare Locked.." << endl;) MUTEX_DEBUG(cerr << nm << " prepare Locked.." << endl;)
wr_wait += 1; wr_wait +=1;
m.writeLock(); m.writeLock();
wr_wait -= 1; wr_wait -=1;
MUTEX_DEBUG(cerr << nm << " Locked.." << endl;) MUTEX_DEBUG(cerr << nm << " Locked.." << endl;)
} }
void uniset_rwmutex::wrlock() void uniset_rwmutex::wrlock()
{ {
MUTEX_DEBUG(cerr << nm << " prepare WRLocked.." << endl;) MUTEX_DEBUG(cerr << nm << " prepare WRLocked.." << endl;)
wr_wait += 1; wr_wait +=1;
m.writeLock(); m.writeLock();
wr_wait -= 1; wr_wait -=1;
MUTEX_DEBUG(cerr << nm << " WRLocked.." << endl;) MUTEX_DEBUG(cerr << nm << " WRLocked.." << endl;)
} }
void uniset_rwmutex::rlock() void uniset_rwmutex::rlock()
{ {
MUTEX_DEBUG(cerr << nm << " prepare RLocked.." << endl;) MUTEX_DEBUG(cerr << nm << " prepare RLocked.." << endl;)
while( wr_wait > 0 ) while( wr_wait )
msleep(2); msleep(2);
m.readLock(); m.readLock();
MUTEX_DEBUG(cerr << nm << " RLocked.." << endl;) MUTEX_DEBUG(cerr << nm << " RLocked.." << endl;)
......
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