7 #ifndef PXR_BASE_TF_REF_PTR_TRACKER_H
8 #define PXR_BASE_TF_REF_PTR_TRACKER_H
173 void _RemoveTraces(
const void* owner);
176 typedef std::mutex _Mutex;
177 typedef std::lock_guard<std::mutex> _Lock;
178 mutable _Mutex _mutex;
219 #define TF_DECLARE_REFPTR_TRACK(T) \
221 Tf_RefPtrTracker_FirstRef(const void*, const TfRefBase *obj, T*); \
223 Tf_RefPtrTracker_LastRef(const void*, const TfRefBase *obj, T*); \
225 Tf_RefPtrTracker_New(const void* owner, const TfRefBase *obj, T*); \
227 Tf_RefPtrTracker_Delete(const void* owner, const TfRefBase *obj, T*); \
229 Tf_RefPtrTracker_Assign(const void* owner, \
230 const TfRefBase *obj, const TfRefBase *oldObj, T*);
232 #define TF_DEFINE_REFPTR_TRACK(T, COND) \
234 Tf_RefPtrTracker_FirstRef(const void*, const TfRefBase *obj, T*) { \
235 if (obj && COND(obj)) Tf_RefPtrTrackerUtil::Watch(obj); \
238 Tf_RefPtrTracker_LastRef(const void*, const TfRefBase *obj, T*) { \
239 Tf_RefPtrTrackerUtil::Unwatch(obj); \
242 Tf_RefPtrTracker_New(const void* owner, const TfRefBase *obj, T*) { \
243 Tf_RefPtrTrackerUtil::AddTrace(owner, obj); \
246 Tf_RefPtrTracker_Delete(const void* owner, const TfRefBase *obj, T*) { \
247 Tf_RefPtrTrackerUtil::RemoveTraces(owner); \
250 Tf_RefPtrTracker_Assign(const void* owner, const TfRefBase *obj, \
251 const TfRefBase *oldObj, T*) { \
252 if (oldObj != obj) { \
253 Tf_RefPtrTrackerUtil::AddTrace( \
254 owner, obj, TfRefPtrTracker::Assign); \
TF_API void ReportTracesForWatched(std::ostream &stream, const TfRefBase *watched) const
Writes traces for all owners of watched.
static bool WatchNone(const void *)
static void AddTrace(const void *owner, const TfRefBase *obj, TfRefPtrTracker::TraceType type=TfRefPtrTracker::Add)
TfHashMap< const TfRefBase *, size_t, TfHash > WatchedCounts
TF_API_TEMPLATE_CLASS(TfSingleton< TfRefPtrTracker >)
static bool WatchAll(const void *)
GLint GLint GLsizei GLint GLenum GLenum type
TF_API void ReportAllTraces(std::ostream &stream) const
Writes all traces to stream.
TfHashMap< const void *, Trace, TfHash > OwnerTraces
Maps a TfRefPtr address to the most recent trace for it.
TraceType type
Whether the TfRefPtr was created or assigned to.
static void Unwatch(const TfRefBase *obj)
Stop watching obj. Existing traces for obj are kept.
TF_API WatchedCounts GetWatchedCounts() const
static void Watch(const TfRefBase *obj)
Start watching obj. Only watched objects are traced.
TF_API OwnerTraces GetAllTraces() const
Returns traces for all owners. Returns a copy for thread safety.
std::vector< uintptr_t > trace
The stack trace when the TfRefPtr was created or assigned to.
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
const TfRefBase * obj
The object being pointed to.
static TF_API TfRefPtrTracker & GetInstance()
TF_API void ReportAllWatchedCounts(std::ostream &stream) const
static void RemoveTraces(const void *owner)
Remove traces for owner owner.
#define PXR_NAMESPACE_CLOSE_SCOPE
TF_API void SetStackTraceMaxDepth(size_t)
Sets the maximum stack trace depth.
TF_API size_t GetStackTraceMaxDepth() const
Returns the maximum stack trace depth.