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