aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikailbag <mikailbag@yandex-team.com>2025-06-10 20:35:32 +0300
committermikailbag <mikailbag@yandex-team.com>2025-06-10 21:05:41 +0300
commit2851ed080b67be3b38a07bca1da9da9924bdc61b (patch)
tree82908b44df17a2bd6bcef9bc3609ee60d832751d
parent78269221c841f51094be1a828850d4d9d6a665bf (diff)
downloadydb-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
-rw-r--r--contrib/libs/tcmalloc/patches/020-user-data.patch100
-rw-r--r--contrib/libs/tcmalloc/patches/030-soft-limit-handler.patch4
-rw-r--r--contrib/libs/tcmalloc/patches/900-undeprecate-rate-interval.patch2
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/internal/logging.cc1
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/internal/logging.h15
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/internal/profile_builder.cc3
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/internal_malloc_extension.h3
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/malloc_extension.cc16
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/malloc_extension.h8
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/static_vars.h5
-rw-r--r--contrib/libs/tcmalloc/tcmalloc/tcmalloc.cc5
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.