24 #ifndef PXR_BASE_TF_REF_PTR_TRACKER_H
25 #define PXR_BASE_TF_REF_PTR_TRACKER_H
31 #include "pxr/base/tf/api.h"
33 #include "pxr/base/tf/hashmap.h"
36 #include <boost/noncopyable.hpp>
41 PXR_NAMESPACE_OPEN_SCOPE
99 enum TraceType { Add, Assign };
186 void _AddTrace(
const void* owner,
const TfRefBase* obj, TraceType = Add);
189 void _RemoveTraces(
const void* owner);
192 typedef std::mutex _Mutex;
193 typedef std::lock_guard<std::mutex> _Lock;
194 mutable _Mutex _mutex;
199 friend class Tf_RefPtrTrackerUtil;
206 class Tf_RefPtrTrackerUtil {
211 TfRefPtrTracker::GetInstance()._Watch(obj);
215 static void Unwatch(
const TfRefBase* obj)
217 TfRefPtrTracker::GetInstance()._Unwatch(obj);
222 static void AddTrace(
const void* owner,
const TfRefBase* obj,
223 TfRefPtrTracker::TraceType type = TfRefPtrTracker::Add)
225 TfRefPtrTracker::GetInstance()._AddTrace(owner, obj, type);
229 static void RemoveTraces(
const void* owner)
231 TfRefPtrTracker::GetInstance()._RemoveTraces(owner);
235 #define TF_DECLARE_REFPTR_TRACK(T) \
236 inline void Tf_RefPtrTracker_FirstRef(const void*, T* obj); \
237 inline void Tf_RefPtrTracker_LastRef(const void*, T* obj); \
238 inline void Tf_RefPtrTracker_New(const void* owner, T* obj); \
239 inline void Tf_RefPtrTracker_Delete(const void* owner, T* obj); \
240 inline void Tf_RefPtrTracker_Assign(const void* owner, T* obj, T* oldObj);
242 #define TF_DEFINE_REFPTR_TRACK(T, COND) \
243 inline void Tf_RefPtrTracker_FirstRef(const void*, T* obj) { \
244 if (obj && COND(obj)) Tf_RefPtrTrackerUtil::Watch(obj); \
246 inline void Tf_RefPtrTracker_LastRef(const void*, T* obj) { \
247 Tf_RefPtrTrackerUtil::Unwatch(obj); \
249 inline void Tf_RefPtrTracker_New(const void* owner, T* obj) { \
250 Tf_RefPtrTrackerUtil::AddTrace(owner, obj); \
252 inline void Tf_RefPtrTracker_Delete(const void* owner, T* obj) { \
253 Tf_RefPtrTrackerUtil::RemoveTraces(owner); \
255 inline void Tf_RefPtrTracker_Assign(const void* owner, T* obj, T* oldObj) { \
256 if (oldObj != obj) { \
257 Tf_RefPtrTrackerUtil::AddTrace(owner, obj, TfRefPtrTracker::Assign);\
261 PXR_NAMESPACE_CLOSE_SCOPE
Manage a single instance of an object.
Manage a single instance of an object (see.
std::vector< uintptr_t > trace
The stack trace when the TfRefPtr was created or assigned to.
TF_API void ReportAllWatchedCounts(std::ostream &stream) const
Writes all watched objects and the number of owners of each to stream.
TraceType type
Whether the TfRefPtr was created or assigned to.
const TfRefBase * obj
The object being pointed to.
static bool WatchNone(const void *)
Handy function to pass as second argument to TF_DEFINE_REFPTR_TRACK.
Enable a concrete base class for use with TfRefPtr.
Provides tracking of TfRefPtr objects to particular objects.
TF_API void ReportTracesForWatched(std::ostream &stream, const TfRefBase *watched) const
Writes traces for all owners of watched.
TF_API void SetStackTraceMaxDepth(size_t)
Sets the maximum stack trace depth.
static T & GetInstance()
Return a reference to an object of type T, creating it if necessary.
TfHashMap< const void *, Trace, TfHash > OwnerTraces
Maps a TfRefPtr address to the most recent trace for it.
TF_API WatchedCounts GetWatchedCounts() const
Returns the watched objects and the number of owners of each.
Reference-counted smart pointer utility class.
static bool WatchAll(const void *)
Handy function to pass as second argument to TF_DEFINE_REFPTR_TRACK.
TF_API void ReportAllTraces(std::ostream &stream) const
Writes all traces to stream.
TfHashMap< const TfRefBase *, size_t, TfHash > WatchedCounts
Maps a TfRefBase object pointer to the number of TfRefPtr objects using it.
TF_API size_t GetStackTraceMaxDepth() const
Returns the maximum stack trace depth.
Enable a concrete base class for use with TfWeakPtr.
TF_API OwnerTraces GetAllTraces() const
Returns traces for all owners. Returns a copy for thread safety.