Commit 1ff2eed2 authored by Pavel Vainerman's avatar Pavel Vainerman

Добавил конструкторы перемещения для UniSetTypes::xxxMessage

parent 5edbe776
...@@ -45,19 +45,19 @@ void run_test(std::size_t concurrency, int bound, shared_ptr<SharedMemory>& shm ...@@ -45,19 +45,19 @@ void run_test(std::size_t concurrency, int bound, shared_ptr<SharedMemory>& shm
auto&& r_worker = [&shm,bound] { auto&& r_worker = [&shm,bound] {
int num = bound; int num = bound;
while (num--) { while (num--) {
shm->getValue(11); int v = shm->getValue(11);
} }
}; };
auto&& w_worker = [&shm,bound] { auto&& w_worker = [&shm,bound] {
int num = bound; int num = bound;
while (num--) { while (num--) {
shm->setValue(11,123); shm->setValue(11,num);
} }
}; };
std::vector<std::thread> threads; std::vector<std::thread> threads;
for (std::size_t i = 0; i < concurrency; ++i) { for (std::size_t i = 0; i < concurrency-1; ++i) {
threads.emplace_back(r_worker); threads.emplace_back(r_worker);
} }
threads.emplace_back(w_worker); threads.emplace_back(w_worker);
......
...@@ -305,6 +305,29 @@ class IOController: ...@@ -305,6 +305,29 @@ class IOController:
void checkDepend( std::shared_ptr<USensorInfo>& it, IOController* ); void checkDepend( std::shared_ptr<USensorInfo>& it, IOController* );
void init( const IOController_i::SensorIOInfo& s ); void init( const IOController_i::SensorIOInfo& s );
inline IOController_i::SensorIOInfo getSIO()
{
UniSetTypes::uniset_rwmutex_rlock lock(val_lock);
IOController_i::SensorIOInfo s(*this);
return std::move(s);
}
inline UniSetTypes::SensorMessage getSM()
{
UniSetTypes::uniset_rwmutex_rlock lock(val_lock);
UniSetTypes::SensorMessage sm;
sm.id = si.id;
sm.node = si.node;
sm.sensor_type = type;
sm.value = value;
sm.undefined = undefined;
sm.priority = (UniSetTypes::Message::Priority)priority;
sm.sm_tv_sec = tv_sec;
sm.sm_tv_usec = tv_usec;
sm.ci = ci;
return std::move(sm);
}
}; };
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
......
...@@ -62,6 +62,12 @@ namespace UniSetTypes ...@@ -62,6 +62,12 @@ namespace UniSetTypes
ObjectId consumer; // кому ObjectId consumer; // кому
struct timeval tm; struct timeval tm;
Message( Message&& ) = default;
Message& operator=(Message&& ) = default;
Message( const Message& ) = default;
Message& operator=(const Message& ) = default;
Message(); Message();
// для оптимизации, делаем конструктор который не будет инициализировать свойства класса // для оптимизации, делаем конструктор который не будет инициализировать свойства класса
...@@ -83,6 +89,12 @@ namespace UniSetTypes ...@@ -83,6 +89,12 @@ namespace UniSetTypes
class VoidMessage : public Message class VoidMessage : public Message
{ {
public: public:
VoidMessage( VoidMessage&& ) = default;
VoidMessage& operator=(VoidMessage&& ) = default;
VoidMessage( const VoidMessage& ) = default;
VoidMessage& operator=( const VoidMessage& ) = default;
// для оптимизации, делаем конструктор который не будет инициализировать свойства класса // для оптимизации, делаем конструктор который не будет инициализировать свойства класса
// это необходимо для VoidMessage, который конструируется при помощи memcpy // это необходимо для VoidMessage, который конструируется при помощи memcpy
VoidMessage( int dummy ):Message(dummy){} VoidMessage( int dummy ):Message(dummy){}
...@@ -128,6 +140,11 @@ namespace UniSetTypes ...@@ -128,6 +140,11 @@ namespace UniSetTypes
bool threshold; /*!< TRUE - сработал порог, FALSE - порог отключился */ bool threshold; /*!< TRUE - сработал порог, FALSE - порог отключился */
UniSetTypes::ThresholdId tid; UniSetTypes::ThresholdId tid;
SensorMessage( SensorMessage&& ) = default;
SensorMessage& operator=(SensorMessage&& ) = default;
SensorMessage( const SensorMessage& ) = default;
SensorMessage& operator=( const SensorMessage& ) = default;
SensorMessage(); SensorMessage();
SensorMessage(ObjectId id, long value, const IOController_i::CalibrateInfo& ci=IOController_i::CalibrateInfo(), SensorMessage(ObjectId id, long value, const IOController_i::CalibrateInfo& ci=IOController_i::CalibrateInfo(),
Priority priority = Message::Medium, Priority priority = Message::Medium,
...@@ -161,6 +178,11 @@ namespace UniSetTypes ...@@ -161,6 +178,11 @@ namespace UniSetTypes
LogRotate /*! переоткрыть файлы логов */ LogRotate /*! переоткрыть файлы логов */
}; };
SystemMessage( SystemMessage&& ) = default;
SystemMessage& operator=(SystemMessage&& ) = default;
SystemMessage( const SystemMessage& ) = default;
SystemMessage& operator=( const SystemMessage& ) = default;
SystemMessage(); SystemMessage();
SystemMessage(Command command, Priority priority = Message::High, SystemMessage(Command command, Priority priority = Message::High,
ObjectId consumer=UniSetTypes::DefaultObjectId); ObjectId consumer=UniSetTypes::DefaultObjectId);
...@@ -181,6 +203,11 @@ namespace UniSetTypes ...@@ -181,6 +203,11 @@ namespace UniSetTypes
class TimerMessage : public Message class TimerMessage : public Message
{ {
public: public:
TimerMessage( TimerMessage&& ) = default;
TimerMessage& operator=(TimerMessage&& ) = default;
TimerMessage( const TimerMessage& ) = default;
TimerMessage& operator=( const TimerMessage& ) = default;
TimerMessage(); TimerMessage();
TimerMessage(UniSetTypes::TimerId id, Priority prior = Message::High, TimerMessage(UniSetTypes::TimerId id, Priority prior = Message::High,
ObjectId cons=UniSetTypes::DefaultObjectId); ObjectId cons=UniSetTypes::DefaultObjectId);
...@@ -212,6 +239,10 @@ namespace UniSetTypes ...@@ -212,6 +239,10 @@ namespace UniSetTypes
time_t in_confirm, time_t in_confirm,
Priority in_priority = Message::Medium); Priority in_priority = Message::Medium);
ConfirmMessage( ConfirmMessage&& ) = default;
ConfirmMessage& operator=(ConfirmMessage&& ) = default;
ConfirmMessage( const ConfirmMessage& ) = default;
ConfirmMessage& operator=( const ConfirmMessage& ) = default;
long sensor_id; /* ID датчика */ long sensor_id; /* ID датчика */
double value; /* значение датчика */ double value; /* значение датчика */
......
...@@ -457,19 +457,11 @@ void IOController::dumpToDB() ...@@ -457,19 +457,11 @@ void IOController::dumpToDB()
// uniset_mutex_lock lock(ioMutex, 100); // uniset_mutex_lock lock(ioMutex, 100);
for( auto li = ioList.begin(); li!=ioList.end(); ++li ) for( auto li = ioList.begin(); li!=ioList.end(); ++li )
{ {
uniset_rwmutex_rlock lock(li->second->val_lock);
SensorMessage sm;
sm.id = li->second->si.id;
sm.node = li->second->si.node;
sm.sensor_type = li->second->type;
sm.value = li->second->value;
sm.undefined = li->second->undefined;
sm.priority = (Message::Priority)li->second->priority;
sm.sm_tv_sec = li->second->tv_sec;
sm.sm_tv_usec = li->second->tv_usec;
sm.ci = li->second->ci;
if ( !li->second->dbignore ) if ( !li->second->dbignore )
{
SensorMessage sm(li->second->getSM());
logging(sm); logging(sm);
}
} }
} // unlock } // unlock
} }
...@@ -679,8 +671,7 @@ IOController_i::SensorInfoSeq* IOController::getSensorSeq( const IDSeq& lst ) ...@@ -679,8 +671,7 @@ IOController_i::SensorInfoSeq* IOController::getSensorSeq( const IDSeq& lst )
auto it = ioList.find(lst[i]); auto it = ioList.find(lst[i]);
if( it!=ioList.end() ) if( it!=ioList.end() )
{ {
uniset_rwmutex_rlock lock(it->second->val_lock); (*res)[i] = it->second->getSIO();
(*res)[i] = *(it->second.get());
continue; continue;
} }
......
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