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"
20 namespace lldb_private {
24 class shared_ptr_refcount : public lldb_private::imp::shared_count {
27 shared_ptr_refcount(Y *in) : shared_count(0), manager(in) {}
29 shared_ptr_refcount() : shared_count(0) {}
31 ~shared_ptr_refcount() override {}
33 void on_zero_shared() override { manager->DecrementRefCount(); }
41 template <class T> class ClusterManager {
43 ClusterManager() : m_objects(), m_external_ref(0), m_mutex() {}
46 for (typename llvm::SmallPtrSet<T *, 16>::iterator pos = m_objects.begin(),
47 end = m_objects.end();
53 // Decrement refcount should have been called on this ClusterManager, and
54 // it should have locked the mutex, now we will unlock it before we destroy
59 void ManageObject(T *new_object) {
60 std::lock_guard<std::mutex> guard(m_mutex);
61 m_objects.insert(new_object);
64 typename lldb_private::SharingPtr<T> GetSharedPointer(T *desired_object) {
66 std::lock_guard<std::mutex> guard(m_mutex);
68 if (0 == m_objects.count(desired_object)) {
69 lldbassert(false && "object not found in shared cluster when expected");
70 desired_object = nullptr;
73 return typename lldb_private::SharingPtr<T>(
74 desired_object, new imp::shared_ptr_refcount<ClusterManager>(this));
78 void DecrementRefCount() {
81 if (m_external_ref == 0)
87 friend class imp::shared_ptr_refcount<ClusterManager>;
89 llvm::SmallPtrSet<T *, 16> m_objects;
94 } // namespace lldb_private
96 #endif // utility_SharedCluster_h_