diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 11:32:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 11:32:39 +0000 |
commit | 56ae875861ab260b80a030f50c4aff9f9dc8fff0 (patch) | |
tree | 531412110fc901a5918c7f7442202804a83cada9 /lib/base/shared-object.hpp | |
parent | Initial commit. (diff) | |
download | icinga2-56ae875861ab260b80a030f50c4aff9f9dc8fff0.tar.xz icinga2-56ae875861ab260b80a030f50c4aff9f9dc8fff0.zip |
Adding upstream version 2.14.2.upstream/2.14.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | lib/base/shared-object.hpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/base/shared-object.hpp b/lib/base/shared-object.hpp new file mode 100644 index 0000000..58636dc --- /dev/null +++ b/lib/base/shared-object.hpp @@ -0,0 +1,73 @@ +/* Icinga 2 | (c) 2019 Icinga GmbH | GPLv2+ */ + +#ifndef SHARED_OBJECT_H +#define SHARED_OBJECT_H + +#include "base/atomic.hpp" +#include "base/object.hpp" +#include <cstdint> + +namespace icinga +{ + +class SharedObject; + +inline void intrusive_ptr_add_ref(SharedObject *object); +inline void intrusive_ptr_release(SharedObject *object); + +/** + * Seamless and polymorphistic base for any class to create shared pointers of. + * Saves a memory allocation compared to std::shared_ptr. + * + * @ingroup base + */ +class SharedObject +{ + friend void intrusive_ptr_add_ref(SharedObject *object); + friend void intrusive_ptr_release(SharedObject *object); + +protected: + inline SharedObject() : m_References(0) + { + } + + inline SharedObject(const SharedObject&) : SharedObject() + { + } + + inline SharedObject(SharedObject&&) : SharedObject() + { + } + + inline SharedObject& operator=(const SharedObject&) + { + return *this; + } + + inline SharedObject& operator=(SharedObject&&) + { + return *this; + } + + inline virtual + ~SharedObject() = default; + +private: + Atomic<uint_fast64_t> m_References; +}; + +inline void intrusive_ptr_add_ref(SharedObject *object) +{ + object->m_References.fetch_add(1); +} + +inline void intrusive_ptr_release(SharedObject *object) +{ + if (object->m_References.fetch_sub(1) == 1u) { + delete object; + } +} + +} + +#endif /* SHARED_OBJECT_H */ |