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 {
23 class shared_ptr_refcount : public lldb_private::imp::shared_count
26 template<class Y> shared_ptr_refcount (Y *in) : shared_count (0), manager(in) {}
28 shared_ptr_refcount() : shared_count (0) {}
30 ~shared_ptr_refcount() override
34 void on_zero_shared() override
36 manager->DecrementRefCount();
49 ClusterManager() : m_objects(), m_external_ref(0), m_mutex() {}
53 for (typename llvm::SmallPtrSet<T *, 16>::iterator pos = m_objects.begin(), end = m_objects.end(); pos != end;
60 // Decrement refcount should have been called on this ClusterManager,
61 // and it should have locked the mutex, now we will unlock it before
67 ManageObject(T *new_object)
69 std::lock_guard<std::mutex> guard(m_mutex);
70 m_objects.insert(new_object);
73 typename lldb_private::SharingPtr<T>
74 GetSharedPointer(T *desired_object)
77 std::lock_guard<std::mutex> guard(m_mutex);
79 if (0 == m_objects.count(desired_object))
81 lldbassert(false && "object not found in shared cluster when expected");
82 desired_object = nullptr;
85 return typename lldb_private::SharingPtr<T>(desired_object, new imp::shared_ptr_refcount<ClusterManager>(this));
94 if (m_external_ref == 0)
100 friend class imp::shared_ptr_refcount<ClusterManager>;
102 llvm::SmallPtrSet<T *, 16> m_objects;
107 } // namespace lldb_private
109 #endif // utility_SharedCluster_h_