7#ifndef PXR_BASE_TF_MALLOC_TAG_H
8#define PXR_BASE_TF_MALLOC_TAG_H
11#include "pxr/base/tf/api.h"
20PXR_NAMESPACE_OPEN_SCOPE
25struct Tf_MallocPathNode;
118 size_t maxPrintedNodes = 100000)
const;
127 const std::string &rootName)
const;
132 std::ostream &out)
const;
189 return TfMallocTag::_isInitialized;
252 Auto& operator=(
const Auto &) =
delete;
274 template <
class Str,
class... Strs>
275 explicit Auto(Str &&name1, Strs &&... nameN)
276 : _threadData(
TfMallocTag::_Push(_CStr(
std::forward<Str>(name1))))
277 , _nTags(_threadData ? 1 + sizeof...(Strs) : 0) {
279 (..., TfMallocTag::_Begin(
280 _CStr(std::forward<Strs>(nameN)), _threadData));
296 TfMallocTag::_End(_nTags, _threadData);
297 _threadData =
nullptr;
312 char const *_CStr(
char const *cstr)
const {
return cstr; }
313 char const *_CStr(std::string
const &str)
const {
return str.c_str(); }
315 _ThreadData* _threadData;
335 static void Push(
const std::string& name) {
340 static void Push(
const char* name) {
350 if (TfMallocTag::_isInitialized) {
405 friend struct _TemporaryDisabler;
407 friend struct Tf_MallocGlobalData;
409 static bool _Initialize(std::string* errMsg);
411 static inline _ThreadData *_Push(
char const *name) {
412 if (TfMallocTag::_isInitialized) {
418 TF_API
static _ThreadData *_Begin(
char const *name,
419 _ThreadData *threadData =
nullptr);
420 TF_API
static void _End(
int nTags = 1, _ThreadData *threadData =
nullptr);
422 static void* _MallocWrapper(
size_t,
const void*);
423 static void* _ReallocWrapper(
void*,
size_t,
const void*);
424 static void* _MemalignWrapper(
size_t,
size_t,
const void*);
425 static void _FreeWrapper(
void*,
const void*);
429 friend class TfMallocTag::Tls;
430 TF_API
static std::atomic<bool> _isInitialized;
473PXR_NAMESPACE_CLOSE_SCOPE
475#define TF_MALLOC_TAG_NEW(name1, name2) \
477 inline void* operator new(::std::size_t, void* ptr) { \
481 inline void* operator new(::std::size_t s) { \
482 PXR_NS::TfAutoMallocTag tag(name1, name2); \
486 inline void* operator new[](::std::size_t s) { \
487 PXR_NS::TfAutoMallocTag tag(name1, name2); \
492 inline void operator delete(void* ptr, void* place) {} \
494 inline void operator delete(void* ptr, size_t) { \
498 inline void operator delete[] (void* ptr, size_t) { \
Auto(Str &&name1, Strs &&... nameN)
Push one or more memory tags onto the local-call stack with names name1 ... nameN.
~Auto()
Pop a memory tag from the local-call stack.
void Release()
Pop the tag from the stack before it is destructed.
Top-down memory tagging system.
static void Push(const char *name)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static TF_API void SetDebugMatchList(const std::string &matchList)
Sets the tags to trap in the debugger.
size_t numAllocations
The number of allocations (always one unless stack frames have been combined to create unique stacks)...
static TF_API std::vector< std::vector< uintptr_t > > GetCapturedMallocStacks()
Returns the captured malloc stack traces for allocations billed to the malloc tags passed to SetCaptu...
static TF_API void SetCapturedMallocStacksMatchList(const std::string &matchList)
Sets the tags to trace.
static void Push(const std::string &name)
Manually push a tag onto the stack.
std::vector< uintptr_t > stack
The stack frame pointers.
size_t size
The amount of allocated memory (accumulated over all allocations sharing this call stack).
static TF_API size_t GetTotalBytes()
Return total number of allocated bytes.
static TF_API bool Initialize(std::string *errMsg)
Initialize the memory tagging system.
static bool IsInitialized()
Return true if the tagging system is active.
static void Pop()
Manually pop a tag from the stack.
static TF_API bool GetCallTree(CallTree *tree, bool skipRepeated=true)
Return a snapshot of memory usage.
static TF_API size_t GetMaxTotalBytes()
Return the maximum total number of bytes that have ever been allocated at one time.
This struct is used to represent a call stack taken for an allocation that was billed under a specifi...
Summary data structure for malloc statistics.
std::vector< PathNode > children
Children nodes.
TF_API std::string GetPrettyPrintString(PrintSetting setting=BOTH, size_t maxPrintedNodes=100000) const
Return the malloc report string.
size_t nAllocations
The number of allocations for this node.
std::string siteName
Tag name.
std::vector< CallStackInfo > capturedCallStacks
The captured malloc stacks.
size_t nBytes
Allocated bytes by this or descendant nodes.
TF_API void Report(std::ostream &out) const
Generates a report to the ostream out.
size_t nBytesDirect
Allocated bytes (only for this node).
std::string name
Tag name.
PrintSetting
Specify which parts of the report to print.
@ BOTH
Print both tree and call sites.
@ TREE
Print the full call tree.
@ CALLSITES
Print just the call sites > 0.1%.
PathNode root
Root node of the call-site hierarchy.
TF_API void Report(std::ostream &out, const std::string &rootName) const
Generates a report to the ostream out.
TF_API bool LoadReport(std::istream &in)
Load the contents of in into the root of the call tree.
std::vector< CallSite > callSites
All call sites.
Record of the bytes allocated under each different tag.
Node in the call tree structure.