ADD: made data threadsafe
This commit is contained in:
@@ -1,29 +1,57 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
namespace SimCore
|
namespace SimCore
|
||||||
{
|
{
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class Data{
|
class Data{
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
T data_;
|
|
||||||
|
|
||||||
bool valid_;
|
|
||||||
|
|
||||||
std::uint64_t writeTime_;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Data():valid_(false),writeTime_(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count())
|
Data():mx(),valid_(false),writeTime_(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count())
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Data (const Data &other)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(other.mx);
|
||||||
|
if (typeid(other.data_) == typeid(data_))
|
||||||
|
{
|
||||||
|
data_ = other.data_;
|
||||||
|
valid_ = true;
|
||||||
|
writeTime_ = other.writeTime_;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
valid_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Data& operator=(const Data other)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(other.mx);
|
||||||
|
if (typeid(other.data_) == typeid(data_))
|
||||||
|
{
|
||||||
|
this->data_ = other.data_;
|
||||||
|
this->valid_ = other.valid_;
|
||||||
|
this->writeTime_ = other.writeTime_;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
this->valid_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
void setValue(T value)
|
void setValue(T value)
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(mx);
|
||||||
data_ = value;
|
data_ = value;
|
||||||
valid_ = true;
|
valid_ = true;
|
||||||
writeTime_ = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
|
writeTime_ = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
|
||||||
@@ -31,6 +59,7 @@ namespace SimCore
|
|||||||
|
|
||||||
T getValue()
|
T getValue()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(mx);
|
||||||
return data_;
|
return data_;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,13 +71,24 @@ namespace SimCore
|
|||||||
|
|
||||||
bool isValid()
|
bool isValid()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(mx);
|
||||||
return valid_;
|
return valid_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint64_t getWriteTime()
|
std::uint64_t getWriteTime()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> guard(mx);
|
||||||
return writeTime_;
|
return writeTime_;
|
||||||
}
|
}
|
||||||
|
private:
|
||||||
|
|
||||||
|
T data_;
|
||||||
|
|
||||||
|
bool valid_;
|
||||||
|
|
||||||
|
std::uint64_t writeTime_;
|
||||||
|
|
||||||
|
mutable std::mutex mx;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user