common/concurrentmap.h (50 lines of code) (raw):

#pragma once #include <map> #include <string> #include <mutex> namespace swss { template <typename K, typename V> class ConcurrentMap { public: ConcurrentMap() = default; public: size_t size() { std::lock_guard<std::mutex> _lock(m_mutex); return m_map.size(); } bool contains(const K& key) { std::lock_guard<std::mutex> _lock(m_mutex); return m_map.find(key) != m_map.end(); } void insert(const std::pair<K,V>& pair) { std::lock_guard<std::mutex> _lock(m_mutex); m_map.insert(pair); } void set(const K& key, const V& value) { std::lock_guard<std::mutex> _lock(m_mutex); m_map[key] = value; } // return copy V get(const K& key) { std::lock_guard<std::mutex> _lock(m_mutex); return m_map[key]; } // return copy std::map<K,V> getCopy() { std::lock_guard<std::mutex> _lock(m_mutex); return m_map; } private: ConcurrentMap(const ConcurrentMap&); ConcurrentMap& operator=(const ConcurrentMap&); private: std::map<K,V> m_map; std::mutex m_mutex; }; }