diff options
| author | Dave Houlton <euclid@lindenlab.com> | 2021-09-15 10:11:25 -0600 | 
|---|---|---|
| committer | Dave Houlton <euclid@lindenlab.com> | 2021-09-15 10:11:25 -0600 | 
| commit | f2d4f83931f77282d6cdeba582def46b51c22b89 (patch) | |
| tree | e8fd4aab7556aa1b895f2e601f64491040219dbc | |
| parent | 0f60db6220f544e43a686312cc5e91998309c996 (diff) | |
SL-15962 Add hooks for tracy memory profiling
| -rw-r--r-- | indra/llcommon/linden_common.h | 8 | ||||
| -rw-r--r-- | indra/llcommon/llcommon.cpp | 42 | 
2 files changed, 50 insertions, 0 deletions
| diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h index 45ac43910c..b2c5be6b76 100644 --- a/indra/llcommon/linden_common.h +++ b/indra/llcommon/linden_common.h @@ -27,6 +27,14 @@  #ifndef LL_LINDEN_COMMON_H  #define LL_LINDEN_COMMON_H +#include "llprofiler.h" +#if (TRACY_ENABLE)  // hooks for memory profiling +void *tracy_aligned_malloc(size_t size, size_t alignment); +void  tracy_aligned_free(void *memblock); +#define _aligned_malloc(X, Y) tracy_aligned_malloc((X), (Y)) +#define _aligned_free(X)      tracy_aligned_free((X)) +#endif +  // *NOTE:  Please keep includes here to a minimum!  //  // Files included here are included in every library .cpp file and diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp index 96be913d17..da61e7539a 100644 --- a/indra/llcommon/llcommon.cpp +++ b/indra/llcommon/llcommon.cpp @@ -33,6 +33,48 @@  #include "lltracethreadrecorder.h"  #include "llcleanup.h" +#if (TRACY_ENABLE) +// Override new/delet for tracy memory profiling +void *operator new(size_t size) +{ +    auto ptr = (malloc) (size); +    if (!ptr) +    { +        throw std::bad_alloc(); +        return nullptr; +    } +    TracyAlloc(ptr, size); +    return ptr; +} + +void operator delete(void *ptr) noexcept +{ +    TracyFree(ptr); +    (free)(ptr); +} + +// C-style malloc/free can't be so easily overridden, so we define tracy versions and use +// a pre-processor #define in linden_common.h to redirect to them. The parens around the native +// functions below prevents recursive substitution by the preprocessor. +// +// Unaligned mallocs are rare in LL code but hooking them causes problems in 3p lib code (looking at +// you, Havok), so we'll only capture the aligned version. + +void *tracy_aligned_malloc(size_t size, size_t alignment) +{ +    auto ptr = (_aligned_malloc) (size, alignment); +    if (ptr) TracyAlloc(ptr, size); +    return ptr; +} + +void tracy_aligned_free(void *memblock) +{ +    TracyFree(memblock); +    (_aligned_free)(memblock); +} + +#endif +  //static  BOOL LLCommon::sAprInitialized = FALSE; | 
