1 //===------------------SharedCluster.h --------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_UTILITY_SHAREDCLUSTER_H 10 #define LLDB_UTILITY_SHAREDCLUSTER_H 11 12 #include "lldb/Utility/LLDBAssert.h" 13 #include "llvm/ADT/STLExtras.h" 14 #include "llvm/ADT/SmallVector.h" 15 16 #include <memory> 17 #include <mutex> 18 19 namespace lldb_private { 20 21 template <class T> 22 class ClusterManager : public std::enable_shared_from_this<ClusterManager<T>> { 23 public: Create()24 static std::shared_ptr<ClusterManager> Create() { 25 return std::shared_ptr<ClusterManager>(new ClusterManager()); 26 } 27 ~ClusterManager()28 ~ClusterManager() { 29 for (T *obj : m_objects) 30 delete obj; 31 } 32 ManageObject(T * new_object)33 void ManageObject(T *new_object) { 34 std::lock_guard<std::mutex> guard(m_mutex); 35 assert(!llvm::is_contained(m_objects, new_object) && 36 "ManageObject called twice for the same object?"); 37 m_objects.push_back(new_object); 38 } 39 GetSharedPointer(T * desired_object)40 std::shared_ptr<T> GetSharedPointer(T *desired_object) { 41 std::lock_guard<std::mutex> guard(m_mutex); 42 auto this_sp = this->shared_from_this(); 43 if (!llvm::is_contained(m_objects, desired_object)) { 44 lldbassert(false && "object not found in shared cluster when expected"); 45 desired_object = nullptr; 46 } 47 return {std::move(this_sp), desired_object}; 48 } 49 50 private: ClusterManager()51 ClusterManager() : m_objects(), m_mutex() {} 52 53 llvm::SmallVector<T *, 16> m_objects; 54 std::mutex m_mutex; 55 }; 56 57 } // namespace lldb_private 58 59 #endif // LLDB_UTILITY_SHAREDCLUSTER_H 60