diff options
author | mikailbag <mikailbag@yandex-team.com> | 2025-06-10 20:35:32 +0300 |
---|---|---|
committer | mikailbag <mikailbag@yandex-team.com> | 2025-06-10 21:05:41 +0300 |
commit | 2851ed080b67be3b38a07bca1da9da9924bdc61b (patch) | |
tree | 82908b44df17a2bd6bcef9bc3609ee60d832751d | |
parent | 78269221c841f51094be1a828850d4d9d6a665bf (diff) | |
download | ydb-2851ed080b67be3b38a07bca1da9da9924bdc61b.tar.gz |
Respect user data when hashing samples
Currently allocation sampling code does not account for user-data in samples, so two samples differing only in user data are treated the same. It can negatively affect quality of resulting profiles. This patch effectively rebases [YTSaurus patch](https://github.com/ytsaurus/ytsaurus/commit/7fbc80bd10915c8703b9651eca3bacc96e034a12) on current TCMalloc version, fixing the issue.
commit_hash:82c18820f5c890b8b851df8e3c6ee779144690a0
11 files changed, 127 insertions, 35 deletions
diff --git a/contrib/libs/tcmalloc/patches/020-user-data.patch b/contrib/libs/tcmalloc/patches/020-user-data.patch index 3ff3805f3a6..5bedd2e591d 100644 --- a/contrib/libs/tcmalloc/patches/020-user-data.patch +++ b/contrib/libs/tcmalloc/patches/020-user-data.patch @@ -11,25 +11,26 @@ index 2af67c8..023263a 100644 // How many allocations does this sample represent, given the sampling // frequency (weight) and its size. diff --git a/tcmalloc/internal/logging.cc b/tcmalloc/internal/logging.cc -index 1cd8d18..a53c26a 100644 +index 1cd8d18..13aa0e1 100644 --- a/tcmalloc/internal/logging.cc +++ b/tcmalloc/internal/logging.cc -@@ -43,6 +43,10 @@ GOOGLE_MALLOC_SECTION_BEGIN +@@ -43,6 +43,11 @@ GOOGLE_MALLOC_SECTION_BEGIN namespace tcmalloc { namespace tcmalloc_internal { +ABSL_CONST_INIT SampleUserDataSupport::CreateSampleUserDataCallback* SampleUserDataSupport::create_sample_user_data_callback_ = nullptr; +ABSL_CONST_INIT SampleUserDataSupport::CopySampleUserDataCallback* SampleUserDataSupport::copy_sample_user_data_callback_ = nullptr; +ABSL_CONST_INIT SampleUserDataSupport::DestroySampleUserDataCallback* SampleUserDataSupport::destroy_sample_user_data_callback_ = nullptr; ++ABSL_CONST_INIT SampleUserDataSupport::ComputeSampleUserDataHashCallback* SampleUserDataSupport::compute_sample_user_data_hash_callback_ = nullptr; + // Variables for storing crash output. Allocated statically since we // may not be able to heap-allocate while crashing. ABSL_CONST_INIT static absl::base_internal::SpinLock crash_lock( diff --git a/tcmalloc/internal/logging.h b/tcmalloc/internal/logging.h -index 2a5c761..43975dd 100644 +index 2a5c761..23b3f2a 100644 --- a/tcmalloc/internal/logging.h +++ b/tcmalloc/internal/logging.h -@@ -51,6 +51,96 @@ GOOGLE_MALLOC_SECTION_BEGIN +@@ -51,6 +51,109 @@ GOOGLE_MALLOC_SECTION_BEGIN namespace tcmalloc { namespace tcmalloc_internal { @@ -38,6 +39,7 @@ index 2a5c761..43975dd 100644 + using CreateSampleUserDataCallback = void*(); + using CopySampleUserDataCallback = void*(void*); + using DestroySampleUserDataCallback = void(void*); ++ using ComputeSampleUserDataHashCallback = size_t(void*); + + class UserData { + public: @@ -93,11 +95,21 @@ index 2a5c761..43975dd 100644 + + static void Enable(CreateSampleUserDataCallback create, + CopySampleUserDataCallback copy, -+ DestroySampleUserDataCallback destroy) { ++ DestroySampleUserDataCallback destroy, ++ ComputeSampleUserDataHashCallback compute_hash) { + create_sample_user_data_callback_ = create; + copy_sample_user_data_callback_ = copy; + destroy_sample_user_data_callback_ = destroy; ++ compute_sample_user_data_hash_callback_ = compute_hash; + } ++ ++ static size_t ComputeSampleUserDataHash(void* ptr) noexcept { ++ if (compute_sample_user_data_hash_callback_ != nullptr) { ++ return compute_sample_user_data_hash_callback_(ptr); ++ } ++ return 0; ++ } ++ +private: + static void* CreateSampleUserData() { + if (create_sample_user_data_callback_ != nullptr) { @@ -118,15 +130,17 @@ index 2a5c761..43975dd 100644 + destroy_sample_user_data_callback_(ptr); + } + } ++ + ABSL_CONST_INIT static CreateSampleUserDataCallback* create_sample_user_data_callback_; + ABSL_CONST_INIT static CopySampleUserDataCallback* copy_sample_user_data_callback_; + ABSL_CONST_INIT static DestroySampleUserDataCallback* destroy_sample_user_data_callback_; ++ ABSL_CONST_INIT static ComputeSampleUserDataHashCallback* compute_sample_user_data_hash_callback_; +}; + static constexpr int kMaxStackDepth = 64; // An opaque handle type used to identify allocations. -@@ -84,6 +174,8 @@ struct StackTrace { +@@ -84,6 +187,8 @@ struct StackTrace { // between the previous sample and this one size_t weight; @@ -135,6 +149,23 @@ index 2a5c761..43975dd 100644 // Timestamp of allocation. absl::Time allocation_time; +diff --git a/tcmalloc/internal/profile_builder.cc b/tcmalloc/internal/profile_builder.cc +index a74e3c7..5887249 100644 +--- a/tcmalloc/internal/profile_builder.cc ++++ b/tcmalloc/internal/profile_builder.cc +@@ -128,10 +128,11 @@ struct SampleEqWithSubFields { + + struct SampleHashWithSubFields { + size_t operator()(const Profile::Sample& s) const { ++ size_t user_data_hash = SampleUserDataSupport::ComputeSampleUserDataHash(s.user_data); + return absl::HashOf( + absl::MakeConstSpan(s.stack, s.depth), s.depth, s.requested_size, + s.requested_alignment, s.requested_size_returning, s.allocated_size, +- s.access_hint, s.access_allocated, s.guarded_status, s.type); ++ s.access_hint, s.access_allocated, s.guarded_status, s.type, user_data_hash); + } + }; + diff --git a/tcmalloc/internal/sampled_allocation_recorder.h b/tcmalloc/internal/sampled_allocation_recorder.h index 8e1ec85..7f9818f 100644 --- a/tcmalloc/internal/sampled_allocation_recorder.h @@ -148,10 +179,10 @@ index 8e1ec85..7f9818f 100644 AllocationGuardSpinLockHolder graveyard_lock(&graveyard_.lock); AllocationGuardSpinLockHolder sample_lock(&sample->lock); diff --git a/tcmalloc/internal_malloc_extension.h b/tcmalloc/internal_malloc_extension.h -index 190d742..dc0c0e0 100644 +index 190d742..0a93995 100644 --- a/tcmalloc/internal_malloc_extension.h +++ b/tcmalloc/internal_malloc_extension.h -@@ -157,6 +157,12 @@ ABSL_ATTRIBUTE_WEAK void MallocExtension_Internal_SetMaxTotalThreadCacheBytes( +@@ -157,6 +157,13 @@ ABSL_ATTRIBUTE_WEAK void MallocExtension_Internal_SetMaxTotalThreadCacheBytes( ABSL_ATTRIBUTE_WEAK void MallocExtension_EnableForkSupport(); @@ -160,38 +191,51 @@ index 190d742..dc0c0e0 100644 +MallocExtension_SetSampleUserDataCallbacks( + tcmalloc::MallocExtension::CreateSampleUserDataCallback create, + tcmalloc::MallocExtension::CopySampleUserDataCallback copy, -+ tcmalloc::MallocExtension::DestroySampleUserDataCallback destroy); ++ tcmalloc::MallocExtension::DestroySampleUserDataCallback destroy, ++ tcmalloc::MallocExtension::ComputeSampleUserDataHashCallback compute_hash); } #endif diff --git a/tcmalloc/malloc_extension.cc b/tcmalloc/malloc_extension.cc -index cee8ba3..b7ca15a 100644 +index cee8ba3..47008d0 100644 --- a/tcmalloc/malloc_extension.cc +++ b/tcmalloc/malloc_extension.cc -@@ -804,6 +804,21 @@ void MallocExtension::EnableForkSupport() { +@@ -804,6 +804,33 @@ void MallocExtension::EnableForkSupport() { #endif } +void MallocExtension::SetSampleUserDataCallbacks( + CreateSampleUserDataCallback create, + CopySampleUserDataCallback copy, -+ DestroySampleUserDataCallback destroy) { ++ DestroySampleUserDataCallback destroy, ++ ComputeSampleUserDataHashCallback compute_hash) { +#if ABSL_INTERNAL_HAVE_WEAK_MALLOCEXTENSION_STUBS + if (&MallocExtension_SetSampleUserDataCallbacks != nullptr) { -+ MallocExtension_SetSampleUserDataCallbacks(create, copy, destroy); ++ MallocExtension_SetSampleUserDataCallbacks(create, copy, destroy, compute_hash); + } +#else + (void)create; + (void)copy; + (void)destroy; ++ (void)compute_hash; +#endif +} + ++void MallocExtension::SetSampleUserDataCallbacks( ++ CreateSampleUserDataCallback create, ++ CopySampleUserDataCallback copy, ++ DestroySampleUserDataCallback destroy) { ++ SetSampleUserDataCallbacks(create, copy, destroy, [](void* ptr) -> size_t { ++ (void) ptr; ++ return 0; ++ }); ++} ++ } // namespace tcmalloc // Default implementation just returns size. The expectation is that diff --git a/tcmalloc/malloc_extension.h b/tcmalloc/malloc_extension.h -index 36fd433..702baa8 100644 +index 36fd433..644731b 100644 --- a/tcmalloc/malloc_extension.h +++ b/tcmalloc/malloc_extension.h @@ -214,6 +214,8 @@ class Profile final { @@ -203,7 +247,7 @@ index 36fd433..702baa8 100644 // The following vars are used by the lifetime (deallocation) profiler. uint64_t profile_id; -@@ -664,6 +666,16 @@ class MallocExtension final { +@@ -664,6 +666,24 @@ class MallocExtension final { // Enables fork support. // Allocator will continue to function correctly in the child, after calling fork(). static void EnableForkSupport(); @@ -211,11 +255,19 @@ index 36fd433..702baa8 100644 + using CreateSampleUserDataCallback = void*(); + using CopySampleUserDataCallback = void*(void*); + using DestroySampleUserDataCallback = void(void*); ++ using ComputeSampleUserDataHashCallback = size_t(void*); + + // Sets callbacks for lifetime control of custom user data attached to allocation samples + static void SetSampleUserDataCallbacks( + CreateSampleUserDataCallback create, + CopySampleUserDataCallback copy, ++ DestroySampleUserDataCallback destroy, ++ ComputeSampleUserDataHashCallback compute_hash); ++ ++ // Temporary compat shim. Use 4-argument overload instead. ++ static void SetSampleUserDataCallbacks( ++ CreateSampleUserDataCallback create, ++ CopySampleUserDataCallback copy, + DestroySampleUserDataCallback destroy); }; @@ -241,7 +293,7 @@ index cf57148..c6b6867 100644 static_assert(kMaxStackDepth <= Profile::Sample::kMaxStackDepth, "Profile stack size smaller than internal stack sizes"); diff --git a/tcmalloc/static_vars.h b/tcmalloc/static_vars.h -index 58f706c..010ceed 100644 +index 58f706c..1a5b0aa 100644 --- a/tcmalloc/static_vars.h +++ b/tcmalloc/static_vars.h @@ -26,6 +26,7 @@ @@ -252,7 +304,7 @@ index 58f706c..010ceed 100644 #include "tcmalloc/allocation_sample.h" #include "tcmalloc/arena.h" #include "tcmalloc/central_freelist.h" -@@ -182,6 +183,14 @@ class Static final { +@@ -182,6 +183,15 @@ class Static final { fork_support_enabled_ = true; } @@ -260,26 +312,28 @@ index 58f706c..010ceed 100644 + static void SetSampleUserDataCallbacks( + SampleUserDataSupport::CreateSampleUserDataCallback create, + SampleUserDataSupport::CopySampleUserDataCallback copy, -+ SampleUserDataSupport::DestroySampleUserDataCallback destroy) { -+ SampleUserDataSupport::Enable(create, copy, destroy); ++ SampleUserDataSupport::DestroySampleUserDataCallback destroy, ++ SampleUserDataSupport::ComputeSampleUserDataHashCallback compute_hash) { ++ SampleUserDataSupport::Enable(create, copy, destroy, compute_hash); + } + static bool ABSL_ATTRIBUTE_ALWAYS_INLINE HaveHooks() { return false; } diff --git a/tcmalloc/tcmalloc.cc b/tcmalloc/tcmalloc.cc -index 846ab86..d4d4169 100644 +index 846ab86..33119df 100644 --- a/tcmalloc/tcmalloc.cc +++ b/tcmalloc/tcmalloc.cc -@@ -376,6 +376,12 @@ void TCMallocPostFork() { +@@ -376,6 +376,13 @@ void TCMallocPostFork() { Static::sampled_allocation_recorder().ReleaseInternalLocks(); } +extern "C" void MallocExtension_SetSampleUserDataCallbacks( + MallocExtension::CreateSampleUserDataCallback create, + MallocExtension::CopySampleUserDataCallback copy, -+ MallocExtension::DestroySampleUserDataCallback destroy) { -+ Static::SetSampleUserDataCallbacks(create, copy, destroy); ++ MallocExtension::DestroySampleUserDataCallback destroy, ++ MallocExtension::ComputeSampleUserDataHashCallback compute_hash) { ++ Static::SetSampleUserDataCallbacks(create, copy, destroy, compute_hash); +} // nallocx slow path. diff --git a/contrib/libs/tcmalloc/patches/030-soft-limit-handler.patch b/contrib/libs/tcmalloc/patches/030-soft-limit-handler.patch index 77c54cbff8a..ae1d3e94287 100644 --- a/contrib/libs/tcmalloc/patches/030-soft-limit-handler.patch +++ b/contrib/libs/tcmalloc/patches/030-soft-limit-handler.patch @@ -1,5 +1,5 @@ diff --git a/tcmalloc/malloc_extension.cc b/tcmalloc/malloc_extension.cc -index b7ca15a..dc4aeb5 100644 +index 47008d0..40f2351 100644 --- a/tcmalloc/malloc_extension.cc +++ b/tcmalloc/malloc_extension.cc @@ -804,6 +804,20 @@ void MallocExtension::EnableForkSupport() { @@ -24,7 +24,7 @@ index b7ca15a..dc4aeb5 100644 CreateSampleUserDataCallback create, CopySampleUserDataCallback copy, diff --git a/tcmalloc/malloc_extension.h b/tcmalloc/malloc_extension.h -index 702baa8..0505971 100644 +index 644731b..dab6ea7 100644 --- a/tcmalloc/malloc_extension.h +++ b/tcmalloc/malloc_extension.h @@ -667,6 +667,10 @@ class MallocExtension final { diff --git a/contrib/libs/tcmalloc/patches/900-undeprecate-rate-interval.patch b/contrib/libs/tcmalloc/patches/900-undeprecate-rate-interval.patch index cdb0e19dae1..0db77a9d2f9 100644 --- a/contrib/libs/tcmalloc/patches/900-undeprecate-rate-interval.patch +++ b/contrib/libs/tcmalloc/patches/900-undeprecate-rate-interval.patch @@ -1,5 +1,5 @@ diff --git a/tcmalloc/malloc_extension.h b/tcmalloc/malloc_extension.h -index 0505971..26e15b4 100644 +index dab6ea7..961072e 100644 --- a/tcmalloc/malloc_extension.h +++ b/tcmalloc/malloc_extension.h @@ -476,11 +476,9 @@ class MallocExtension final { diff --git a/contrib/libs/tcmalloc/tcmalloc/internal/logging.cc b/contrib/libs/tcmalloc/tcmalloc/internal/logging.cc index a53c26aa15b..13aa0e1bc67 100644 --- a/contrib/libs/tcmalloc/tcmalloc/internal/logging.cc +++ b/contrib/libs/tcmalloc/tcmalloc/internal/logging.cc @@ -46,6 +46,7 @@ namespace tcmalloc_internal { ABSL_CONST_INIT SampleUserDataSupport::CreateSampleUserDataCallback* SampleUserDataSupport::create_sample_user_data_callback_ = nullptr; ABSL_CONST_INIT SampleUserDataSupport::CopySampleUserDataCallback* SampleUserDataSupport::copy_sample_user_data_callback_ = nullptr; ABSL_CONST_INIT SampleUserDataSupport::DestroySampleUserDataCallback* SampleUserDataSupport::destroy_sample_user_data_callback_ = nullptr; +ABSL_CONST_INIT SampleUserDataSupport::ComputeSampleUserDataHashCallback* SampleUserDataSupport::compute_sample_user_data_hash_callback_ = nullptr; // Variables for storing crash output. Allocated statically since we // may not be able to heap-allocate while crashing. diff --git a/contrib/libs/tcmalloc/tcmalloc/internal/logging.h b/contrib/libs/tcmalloc/tcmalloc/internal/logging.h index ee0fa6f45e9..bd9757533d8 100644 --- a/contrib/libs/tcmalloc/tcmalloc/internal/logging.h +++ b/contrib/libs/tcmalloc/tcmalloc/internal/logging.h @@ -57,6 +57,7 @@ public: using CreateSampleUserDataCallback = void*(); using CopySampleUserDataCallback = void*(void*); using DestroySampleUserDataCallback = void(void*); + using ComputeSampleUserDataHashCallback = size_t(void*); class UserData { public: @@ -112,11 +113,21 @@ public: static void Enable(CreateSampleUserDataCallback create, CopySampleUserDataCallback copy, - DestroySampleUserDataCallback destroy) { + DestroySampleUserDataCallback destroy, + ComputeSampleUserDataHashCallback compute_hash) { create_sample_user_data_callback_ = create; copy_sample_user_data_callback_ = copy; destroy_sample_user_data_callback_ = destroy; + compute_sample_user_data_hash_callback_ = compute_hash; } + + static size_t ComputeSampleUserDataHash(void* ptr) noexcept { + if (compute_sample_user_data_hash_callback_ != nullptr) { + return compute_sample_user_data_hash_callback_(ptr); + } + return 0; + } + private: static void* CreateSampleUserData() { if (create_sample_user_data_callback_ != nullptr) { @@ -137,9 +148,11 @@ private: destroy_sample_user_data_callback_(ptr); } } + ABSL_CONST_INIT static CreateSampleUserDataCallback* create_sample_user_data_callback_; ABSL_CONST_INIT static CopySampleUserDataCallback* copy_sample_user_data_callback_; ABSL_CONST_INIT static DestroySampleUserDataCallback* destroy_sample_user_data_callback_; + ABSL_CONST_INIT static ComputeSampleUserDataHashCallback* compute_sample_user_data_hash_callback_; }; static constexpr int kMaxStackDepth = 64; diff --git a/contrib/libs/tcmalloc/tcmalloc/internal/profile_builder.cc b/contrib/libs/tcmalloc/tcmalloc/internal/profile_builder.cc index a74e3c7ff71..588724974a2 100644 --- a/contrib/libs/tcmalloc/tcmalloc/internal/profile_builder.cc +++ b/contrib/libs/tcmalloc/tcmalloc/internal/profile_builder.cc @@ -128,10 +128,11 @@ struct SampleEqWithSubFields { struct SampleHashWithSubFields { size_t operator()(const Profile::Sample& s) const { + size_t user_data_hash = SampleUserDataSupport::ComputeSampleUserDataHash(s.user_data); return absl::HashOf( absl::MakeConstSpan(s.stack, s.depth), s.depth, s.requested_size, s.requested_alignment, s.requested_size_returning, s.allocated_size, - s.access_hint, s.access_allocated, s.guarded_status, s.type); + s.access_hint, s.access_allocated, s.guarded_status, s.type, user_data_hash); } }; diff --git a/contrib/libs/tcmalloc/tcmalloc/internal_malloc_extension.h b/contrib/libs/tcmalloc/tcmalloc/internal_malloc_extension.h index fc29fad7730..93a65fd4639 100644 --- a/contrib/libs/tcmalloc/tcmalloc/internal_malloc_extension.h +++ b/contrib/libs/tcmalloc/tcmalloc/internal_malloc_extension.h @@ -163,7 +163,8 @@ ABSL_ATTRIBUTE_WEAK void MallocExtension_SetSampleUserDataCallbacks( tcmalloc::MallocExtension::CreateSampleUserDataCallback create, tcmalloc::MallocExtension::CopySampleUserDataCallback copy, - tcmalloc::MallocExtension::DestroySampleUserDataCallback destroy); + tcmalloc::MallocExtension::DestroySampleUserDataCallback destroy, + tcmalloc::MallocExtension::ComputeSampleUserDataHashCallback compute_hash); } #endif diff --git a/contrib/libs/tcmalloc/tcmalloc/malloc_extension.cc b/contrib/libs/tcmalloc/tcmalloc/malloc_extension.cc index dc4aeb5f3b5..40f2351bb33 100644 --- a/contrib/libs/tcmalloc/tcmalloc/malloc_extension.cc +++ b/contrib/libs/tcmalloc/tcmalloc/malloc_extension.cc @@ -821,18 +821,30 @@ MallocExtension::SoftMemoryLimitCallback* MallocExtension::GetSoftMemoryLimitHan void MallocExtension::SetSampleUserDataCallbacks( CreateSampleUserDataCallback create, CopySampleUserDataCallback copy, - DestroySampleUserDataCallback destroy) { + DestroySampleUserDataCallback destroy, + ComputeSampleUserDataHashCallback compute_hash) { #if ABSL_INTERNAL_HAVE_WEAK_MALLOCEXTENSION_STUBS if (&MallocExtension_SetSampleUserDataCallbacks != nullptr) { - MallocExtension_SetSampleUserDataCallbacks(create, copy, destroy); + MallocExtension_SetSampleUserDataCallbacks(create, copy, destroy, compute_hash); } #else (void)create; (void)copy; (void)destroy; + (void)compute_hash; #endif } +void MallocExtension::SetSampleUserDataCallbacks( + CreateSampleUserDataCallback create, + CopySampleUserDataCallback copy, + DestroySampleUserDataCallback destroy) { + SetSampleUserDataCallbacks(create, copy, destroy, [](void* ptr) -> size_t { + (void) ptr; + return 0; + }); +} + } // namespace tcmalloc // Default implementation just returns size. The expectation is that diff --git a/contrib/libs/tcmalloc/tcmalloc/malloc_extension.h b/contrib/libs/tcmalloc/tcmalloc/malloc_extension.h index ea57e3b0460..db293da998e 100644 --- a/contrib/libs/tcmalloc/tcmalloc/malloc_extension.h +++ b/contrib/libs/tcmalloc/tcmalloc/malloc_extension.h @@ -672,11 +672,19 @@ class MallocExtension final { using CreateSampleUserDataCallback = void*(); using CopySampleUserDataCallback = void*(void*); using DestroySampleUserDataCallback = void(void*); + using ComputeSampleUserDataHashCallback = size_t(void*); // Sets callbacks for lifetime control of custom user data attached to allocation samples static void SetSampleUserDataCallbacks( CreateSampleUserDataCallback create, CopySampleUserDataCallback copy, + DestroySampleUserDataCallback destroy, + ComputeSampleUserDataHashCallback compute_hash); + + // Temporary compat shim. Use 4-argument overload instead. + static void SetSampleUserDataCallbacks( + CreateSampleUserDataCallback create, + CopySampleUserDataCallback copy, DestroySampleUserDataCallback destroy); }; diff --git a/contrib/libs/tcmalloc/tcmalloc/static_vars.h b/contrib/libs/tcmalloc/tcmalloc/static_vars.h index a37d14f1f21..38a9a455eb0 100644 --- a/contrib/libs/tcmalloc/tcmalloc/static_vars.h +++ b/contrib/libs/tcmalloc/tcmalloc/static_vars.h @@ -188,8 +188,9 @@ class Static final { static void SetSampleUserDataCallbacks( SampleUserDataSupport::CreateSampleUserDataCallback create, SampleUserDataSupport::CopySampleUserDataCallback copy, - SampleUserDataSupport::DestroySampleUserDataCallback destroy) { - SampleUserDataSupport::Enable(create, copy, destroy); + SampleUserDataSupport::DestroySampleUserDataCallback destroy, + SampleUserDataSupport::ComputeSampleUserDataHashCallback compute_hash) { + SampleUserDataSupport::Enable(create, copy, destroy, compute_hash); } static bool ABSL_ATTRIBUTE_ALWAYS_INLINE HaveHooks() { diff --git a/contrib/libs/tcmalloc/tcmalloc/tcmalloc.cc b/contrib/libs/tcmalloc/tcmalloc/tcmalloc.cc index d4d4169d90e..33119dfd9af 100644 --- a/contrib/libs/tcmalloc/tcmalloc/tcmalloc.cc +++ b/contrib/libs/tcmalloc/tcmalloc/tcmalloc.cc @@ -379,8 +379,9 @@ void TCMallocPostFork() { extern "C" void MallocExtension_SetSampleUserDataCallbacks( MallocExtension::CreateSampleUserDataCallback create, MallocExtension::CopySampleUserDataCallback copy, - MallocExtension::DestroySampleUserDataCallback destroy) { - Static::SetSampleUserDataCallbacks(create, copy, destroy); + MallocExtension::DestroySampleUserDataCallback destroy, + MallocExtension::ComputeSampleUserDataHashCallback compute_hash) { + Static::SetSampleUserDataCallbacks(create, copy, destroy, compute_hash); } // nallocx slow path. |