Commit da6f393f authored by Pavel Vainerman's avatar Pavel Vainerman

Добавил в MosbusMaster использование shared_ptr

parent 745b20c7
......@@ -5,6 +5,7 @@
#include <string>
#include <map>
#include <vector>
#include <memory>
#include "IONotifyController.h"
#include "UniSetObject_LT.h"
#include "PassiveTimer.h"
......@@ -234,7 +235,7 @@ class MBExchange:
InitList initRegList; /*!< список регистров для инициализации */
UniSetTypes::uniset_rwmutex pollMutex;
virtual ModbusClient* initMB( bool reopen=false )= 0;
virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false )= 0;
virtual void poll();
bool pollRTU( RTUDevice* dev, RegMap::iterator& it );
......@@ -311,7 +312,7 @@ class MBExchange:
std::string prop_prefix; /*!< префикс для считывания параметров обмена */
ModbusClient* mb;
std::shared_ptr<ModbusClient> mb;
// определение timeout для соединения
PassiveTimer ptTimeout;
......
......@@ -14,7 +14,7 @@ MBTCPMaster::MBTCPMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shm
SharedMemory* ic, const std::string& prefix ):
MBExchange(objId,shmId,ic,prefix),
force_disconnect(true),
mbtcp(0),
mbtcp(nullptr),
pollThread(0)
{
if( objId == DefaultObjectId )
......@@ -76,25 +76,24 @@ pollThread(0)
MBTCPMaster::~MBTCPMaster()
{
delete pollThread;
delete mbtcp;
//delete mbtcp;
}
// -----------------------------------------------------------------------------
ModbusClient* MBTCPMaster::initMB( bool reopen )
std::shared_ptr<ModbusClient> MBTCPMaster::initMB( bool reopen )
{
if( mbtcp )
{
if( !reopen )
return mbtcp;
delete mbtcp;
mb = 0;
mbtcp = 0;
mbtcp = nullptr;
mb = nullptr;
}
try
{
ost::Thread::setException(ost::Thread::throwException);
mbtcp = new ModbusTCPMaster();
mbtcp = std::make_shared<ModbusTCPMaster>();
ost::InetAddress ia(iaddr.c_str());
mbtcp->connect(ia,port);
......@@ -118,10 +117,8 @@ ModbusClient* MBTCPMaster::initMB( bool reopen )
}
catch(...)
{
if( mbtcp )
delete mbtcp;
mb = 0;
mbtcp = 0;
mb = nullptr;
mbtcp = nullptr;
}
mb = mbtcp;
......
......@@ -5,6 +5,7 @@
#include <string>
#include <map>
#include <vector>
#include <memory>
#include "MBExchange.h"
#include "modbus/ModbusTCPMaster.h"
// -----------------------------------------------------------------------------
......@@ -206,7 +207,7 @@ class MBTCPMaster:
protected:
virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override;
virtual ModbusClient* initMB( bool reopen=false ) override;
virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
UniSetTypes::uniset_rwmutex mbMutex;
std::string iaddr;
......@@ -218,7 +219,7 @@ class MBTCPMaster:
private:
MBTCPMaster();
ModbusTCPMaster* mbtcp;
std::shared_ptr<ModbusTCPMaster> mbtcp;
// т.к. TCP может "зависнуть" на подключении к недоступному узлу
// делаем опрос в отдельном потоке
......
......@@ -98,7 +98,7 @@ checkThread(0)
}
sinf.priority = it1.getIntProp("priority");
sinf.mbtcp = new ModbusTCPMaster();
sinf.mbtcp = std::make_shared<ModbusTCPMaster>();
sinf.recv_timeout = it1.getPIntProp("recv_timeout",recv_timeout);
sinf.aftersend_pause = it1.getPIntProp("aftersend_pause",aftersend_pause);
......@@ -157,13 +157,12 @@ MBTCPMultiMaster::~MBTCPMultiMaster()
delete checkThread;
for( auto &it: mblist )
{
delete it.mbtcp;
it.mbtcp = 0;
it.mbtcp = nullptr;
mbi = mblist.rend();
}
}
// -----------------------------------------------------------------------------
ModbusClient* MBTCPMultiMaster::initMB( bool reopen )
std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
{
// просто движемся по кругу (т.к. связь не проверяется)
// движемся в обратном порядке, т.к. сортировка по возрастанию приоритета
......@@ -209,7 +208,7 @@ ModbusClient* MBTCPMultiMaster::initMB( bool reopen )
{
uniset_rwmutex_wrlock l(tcpMutex);
mbi = mblist.rend();
mb = 0;
mb = nullptr;
}
return 0;
......
......@@ -229,7 +229,7 @@ class MBTCPMultiMaster:
protected:
virtual void sysCommand( const UniSetTypes::SystemMessage *sm ) override;
virtual void initIterators() override;
virtual ModbusClient* initMB( bool reopen=false ) override;
virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
void poll_thread();
void check_thread();
......@@ -250,7 +250,7 @@ class MBTCPMultiMaster:
std::string ip;
int port;
ModbusTCPMaster* mbtcp;
std::shared_ptr<ModbusTCPMaster> mbtcp;
int priority;
bool respond;
......
......@@ -88,16 +88,16 @@ void RTUExchange::help_print( int argc, const char* const* argv )
// -----------------------------------------------------------------------------
RTUExchange::~RTUExchange()
{
delete mbrtu;
// delete mbrtu;
}
// -----------------------------------------------------------------------------
ModbusClient* RTUExchange::initMB( bool reopen )
std::shared_ptr<ModbusClient> RTUExchange::initMB( bool reopen )
{
if( !file_exist(devname) )
{
if( mbrtu )
{
delete mbrtu;
// delete mbrtu;
mb = 0;
mbrtu = 0;
}
......@@ -109,14 +109,14 @@ ModbusClient* RTUExchange::initMB( bool reopen )
if( !reopen )
return mbrtu;
delete mbrtu;
// delete mbrtu;
mbrtu = 0;
mb = 0;
}
try
{
mbrtu = new ModbusRTUMaster(devname,use485F,transmitCtl);
mbrtu = std::make_shared<ModbusRTUMaster>(devname,use485F,transmitCtl);
if( defSpeed != ComPort::ComSpeed0 )
mbrtu->setSpeed(defSpeed);
......@@ -134,16 +134,16 @@ ModbusClient* RTUExchange::initMB( bool reopen )
}
catch( Exception& ex )
{
if( mbrtu )
delete mbrtu;
//if( mbrtu )
// delete mbrtu;
mbrtu = 0;
dwarn << myname << "(init): " << ex << endl;
}
catch(...)
{
if( mbrtu )
delete mbrtu;
// if( mbrtu )
// delete mbrtu;
mbrtu = 0;
dinfo << myname << "(init): catch...." << endl;
......
......@@ -26,7 +26,7 @@ class RTUExchange:
static void help_print( int argc, const char* const* argv );
protected:
ModbusRTUMaster* mbrtu;
std::shared_ptr<ModbusRTUMaster> mbrtu;
UniSetTypes::uniset_mutex mbMutex;
std::string devname;
ComPort::Speed defSpeed;
......@@ -36,7 +36,7 @@ class RTUExchange:
virtual void step() override;
virtual void poll() override;
virtual ModbusClient* initMB( bool reopen=false ) override;
virtual std::shared_ptr<ModbusClient> initMB( bool reopen=false ) override;
virtual bool initDeviceInfo( RTUDeviceMap& m, ModbusRTU::ModbusAddr a, UniXML_iterator& it ) override;
private:
......
......@@ -33,8 +33,7 @@ RTUStorage::~RTUStorage()
}
// -----------------------------------------------------------------------------
void RTUStorage::poll( ModbusRTUMaster* mb )
throw( ModbusRTU::mbException )
void RTUStorage::poll( const std::shared_ptr<ModbusRTUMaster> mb ) throw( ModbusRTU::mbException )
{
try
{
......
......@@ -4,6 +4,7 @@
// -----------------------------------------------------------------------------
#include <ostream>
#include <string>
#include <memory>
#include "modbus/ModbusTypes.h"
#include "UniSetTypes.h"
// -----------------------------------------------------------------------------
......@@ -15,7 +16,7 @@ class RTUStorage
RTUStorage( ModbusRTU::ModbusAddr addr );
~RTUStorage();
void poll( ModbusRTUMaster* mb )
void poll( const std::shared_ptr<ModbusRTUMaster> mb )
throw(ModbusRTU::mbException);
inline ModbusRTU::ModbusAddr getAddress(){ return addr; }
......
......@@ -90,18 +90,18 @@ int main( int argc, char **argv )
<< endl;
}
ModbusRTUMaster mb(dev,use485);
std::shared_ptr<ModbusRTUMaster> mb = std::make_shared<ModbusRTUMaster>(dev,use485);
if( verb )
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) );
mb.setTimeout(tout);
mb.setSpeed(speed);
mb.setLog(dlog);
mb->setTimeout(tout);
mb->setSpeed(speed);
mb->setLog(dlog);
RTUStorage rtu(slaveaddr);
rtu.poll(&mb);
rtu.poll(mb);
cout << rtu << endl;
for( unsigned int i=0; i<24; i++ )
......
#!/bin/sh
./uniset2-start.sh -f ./uniset2-mbtcpmultimaster \
./uniset-start.sh -f ./uniset2-mbtcpmultimaster \
--confile test.xml \
--mbtcp-name MBMultiMaster1 \
--smemory-id SharedMemory \
......
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