summaryrefslogtreecommitdiff
path: root/src/components/include/utils/data_accessor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/include/utils/data_accessor.h')
-rw-r--r--src/components/include/utils/data_accessor.h38
1 files changed, 20 insertions, 18 deletions
diff --git a/src/components/include/utils/data_accessor.h b/src/components/include/utils/data_accessor.h
index f5e99797b..344d6e34a 100644
--- a/src/components/include/utils/data_accessor.h
+++ b/src/components/include/utils/data_accessor.h
@@ -33,40 +33,42 @@
#define SRC_COMPONENTS_INCLUDE_UTILS_DATA_ACCESSOR_H_
#include "utils/lock.h"
+#include "utils/shared_ptr.h"
// This class is for thread-safe access to data
template<class T>
class DataAccessor {
public:
DataAccessor(const T& data, const sync_primitives::Lock& lock)
- : data_(data)
- , lock_(const_cast<sync_primitives::Lock&>(lock))
- , counter_(0) {
- lock_.Acquire();
+ : data_(data),
+ lock_(const_cast<sync_primitives::Lock&>(lock)),
+ counter_( new uint32_t(0)) {
+ lock_.Acquire();
}
- template<class O> DataAccessor(const DataAccessor<O>& other)
- : data_(other.data_)
- , lock_(other.lock_)
- , counter_(other.counter_) {
- ++counter_;
+
+ DataAccessor(const DataAccessor<T>& other)
+ : data_(other.data_),
+ lock_(other.lock_),
+ counter_(other.counter_) {
+ ++(*counter_);
}
+
~DataAccessor() {
- if (counter_ > 0) {
- --counter_;
- }
- if (0 == counter_) {
- lock_.Release();
+ if (0 == *counter_) {
+ lock_.Release();
+ } else {
+ --(*counter_);
}
}
const T& GetData() const {
return data_;
}
private:
- template <class O> const DataAccessor<T>& operator=(const DataAccessor<O>& other);
- const T& data_;
- sync_primitives::Lock& lock_;
- uint32_t counter_;
+ void *operator new(size_t size);
+ const T& data_;
+ sync_primitives::Lock& lock_;
+ utils::SharedPtr<uint32_t> counter_;
};
#endif // SRC_COMPONENTS_INCLUDE_UTILS_DATA_ACCESSOR_H_