From 057c4ca3b9424b8a317ded29593e3a60055b5d6d Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 5 Jan 2018 15:52:58 +0100 Subject: [PATCH] feat(Object): provide a L_SYNC macro to synchronize Object's data --- src/object/object-p.h | 7 ++++++- src/object/object.cpp | 5 +++++ src/object/object.h | 14 +++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/object/object-p.h b/src/object/object-p.h index eafbb9ce4..99b445683 100644 --- a/src/object/object-p.h +++ b/src/object/object-p.h @@ -30,8 +30,13 @@ LINPHONE_BEGIN_NAMESPACE class ObjectPrivate : public BaseObjectPrivate { +protected: + constexpr const Object::Lock &getLock () const { + return lock; + } + private: - std::unordered_map properties; + Object::Lock lock; L_DECLARE_PUBLIC(Object); }; diff --git a/src/object/object.cpp b/src/object/object.cpp index 2fd8c65cf..f10dd9d8b 100644 --- a/src/object/object.cpp +++ b/src/object/object.cpp @@ -46,4 +46,9 @@ shared_ptr Object::getSharedFromThis () const { return nullptr; } +inline const Object::Lock &Object::getLock () const { + L_D(); + return d->getLock(); +} + LINPHONE_END_NAMESPACE diff --git a/src/object/object.h b/src/object/object.h index fec368cba..38e1b62cf 100644 --- a/src/object/object.h +++ b/src/object/object.h @@ -21,12 +21,21 @@ #define _OBJECT_H_ #include +#include #include "base-object.h" #include "property-container.h" // ============================================================================= +// Must be used in Object or ObjectPrivate. +#define L_SYNC() \ + static_assert( \ + !std::is_base_of::value && !std::is_base_of::value, \ + "Unable to lock. Instance is not an Object or ObjectPrivate." \ + ); \ + const std::lock_guard synchronized(const_cast(getLock())); + LINPHONE_BEGIN_NAMESPACE /* @@ -38,14 +47,17 @@ class LINPHONE_PUBLIC Object : public std::enable_shared_from_this, public BaseObject, public PropertyContainer { - public: + typedef std::recursive_mutex Lock; + std::shared_ptr getSharedFromThis (); std::shared_ptr getSharedFromThis () const; protected: explicit Object (ObjectPrivate &p); + const Lock &getLock () const; + private: L_DECLARE_PRIVATE(Object); L_DISABLE_COPY(Object);