From 56ae875861ab260b80a030f50c4aff9f9dc8fff0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 13:32:39 +0200 Subject: Adding upstream version 2.14.2. Signed-off-by: Daniel Baumann --- lib/base/registry.hpp | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 lib/base/registry.hpp (limited to 'lib/base/registry.hpp') diff --git a/lib/base/registry.hpp b/lib/base/registry.hpp new file mode 100644 index 0000000..c13f7e1 --- /dev/null +++ b/lib/base/registry.hpp @@ -0,0 +1,121 @@ +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#ifndef REGISTRY_H +#define REGISTRY_H + +#include "base/i2-base.hpp" +#include "base/string.hpp" +#include +#include +#include + +namespace icinga +{ + +/** + * A registry. + * + * @ingroup base + */ +template +class Registry +{ +public: + typedef std::map ItemMap; + + void RegisterIfNew(const String& name, const T& item) + { + std::unique_lock lock(m_Mutex); + + if (m_Items.find(name) != m_Items.end()) + return; + + RegisterInternal(name, item, lock); + } + + void Register(const String& name, const T& item) + { + std::unique_lock lock(m_Mutex); + + RegisterInternal(name, item, lock); + } + + void Unregister(const String& name) + { + size_t erased; + + { + std::unique_lock lock(m_Mutex); + erased = m_Items.erase(name); + } + + if (erased > 0) + OnUnregistered(name); + } + + void Clear() + { + typename Registry::ItemMap items; + + { + std::unique_lock lock(m_Mutex); + items = m_Items; + } + + for (const auto& kv : items) { + OnUnregistered(kv.first); + } + + { + std::unique_lock lock(m_Mutex); + m_Items.clear(); + } + } + + T GetItem(const String& name) const + { + std::unique_lock lock(m_Mutex); + + auto it = m_Items.find(name); + + if (it == m_Items.end()) + return T(); + + return it->second; + } + + ItemMap GetItems() const + { + std::unique_lock lock(m_Mutex); + + return m_Items; /* Makes a copy of the map. */ + } + + boost::signals2::signal OnRegistered; + boost::signals2::signal OnUnregistered; + +private: + mutable std::mutex m_Mutex; + typename Registry::ItemMap m_Items; + + void RegisterInternal(const String& name, const T& item, std::unique_lock& lock) + { + bool old_item = false; + + if (m_Items.erase(name) > 0) + old_item = true; + + m_Items[name] = item; + + lock.unlock(); + + if (old_item) + OnUnregistered(name); + + OnRegistered(name, item); + } +}; + +} + +#endif /* REGISTRY_H */ -- cgit v1.2.3