1 //===------------------SharedCluster.h --------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef utility_SharedCluster_h_
11 #define utility_SharedCluster_h_
13 #include "lldb/Utility/LLDBAssert.h"
14 #include "lldb/Utility/SharingPtr.h"
16 #include "llvm/ADT/SmallPtrSet.h"
18 namespace lldb_private {
22 class shared_ptr_refcount : public lldb_private::imp::shared_count {
25 shared_ptr_refcount(Y *in) : shared_count(0), manager(in) {}
27 shared_ptr_refcount() : shared_count(0) {}
29 ~shared_ptr_refcount() override {}
31 void on_zero_shared() override { manager->DecrementRefCount(); }
39 template <class T> class ClusterManager {
41 ClusterManager() : m_objects(), m_external_ref(0), m_mutex() {}
44 for (typename llvm::SmallPtrSet<T *, 16>::iterator pos = m_objects.begin(),
45 end = m_objects.end();
51 // Decrement refcount should have been called on this ClusterManager,
52 // and it should have locked the mutex, now we will unlock it before
57 void ManageObject(T *new_object) {
58 std::lock_guard<std::mutex> guard(m_mutex);
59 m_objects.insert(new_object);
62 typename lldb_private::SharingPtr<T> GetSharedPointer(T *desired_object) {
64 std::lock_guard<std::mutex> guard(m_mutex);
66 if (0 == m_objects.count(desired_object)) {
67 lldbassert(false && "object not found in shared cluster when expected");
68 desired_object = nullptr;
71 return typename lldb_private::SharingPtr<T>(
72 desired_object, new imp::shared_ptr_refcount<ClusterManager>(this));
76 void DecrementRefCount() {
79 if (m_external_ref == 0)
85 friend class imp::shared_ptr_refcount<ClusterManager>;
87 llvm::SmallPtrSet<T *, 16> m_objects;
92 } // namespace lldb_private
94 #endif // utility_SharedCluster_h_