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/SharingPtr.h"
14 #include "lldb/Host/Mutex.h"
16 namespace lldb_private {
21 class shared_ptr_refcount : public lldb_private::imp::shared_count
24 template<class Y> shared_ptr_refcount (Y *in) : shared_count (0), manager(in) {}
26 shared_ptr_refcount() : shared_count (0) {}
28 virtual ~shared_ptr_refcount ()
32 virtual void on_zero_shared ()
34 manager->DecrementRefCount();
49 m_mutex(Mutex::eMutexTypeNormal) {}
53 size_t n_items = m_objects.size();
54 for (size_t i = 0; i < n_items; i++)
58 // Decrement refcount should have been called on this ClusterManager,
59 // and it should have locked the mutex, now we will unlock it before
64 void ManageObject (T *new_object)
66 Mutex::Locker locker (m_mutex);
67 if (!ContainsObject(new_object))
68 m_objects.push_back (new_object);
71 typename lldb_private::SharingPtr<T> GetSharedPointer(T *desired_object)
74 Mutex::Locker locker (m_mutex);
76 assert (ContainsObject(desired_object));
78 return typename lldb_private::SharingPtr<T> (desired_object, new imp::shared_ptr_refcount<ClusterManager> (this));
83 bool ContainsObject (const T *desired_object)
85 typename std::vector<T *>::iterator pos, end = m_objects.end();
86 pos = std::find(m_objects.begin(), end, desired_object);
90 void DecrementRefCount ()
94 if (m_external_ref == 0)
100 friend class imp::shared_ptr_refcount<ClusterManager>;
102 std::vector<T *> m_objects;
107 } // namespace lldb_private
108 #endif // utility_SharedCluster_h_