diff --git a/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc b/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc index 47556e5b89..ba0ee790bb 100644 --- a/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc +++ b/src/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc @@ -52,6 +52,10 @@ #include #endif // PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) +#if defined(__MUSL__) +#include "partition_alloc/shim/allocator_shim.h" +#endif + namespace partition_alloc::internal { #if PA_BUILDFLAG(RECORD_ALLOC_INFO) @@ -277,9 +281,25 @@ void PartitionAllocMallocInitOnce() { // However, no perfect solution really exists to make threads + fork() // cooperate, but deadlocks are real (and fork() is used in DEATH_TEST()s), // and other malloc() implementations use the same techniques. + +#if defined(__MUSL__) + allocator_shim::AllocatorDispatch d = + *allocator_shim::GetAllocatorDispatchChainHeadForTesting(); + d.alloc_function = +[](size_t size, AllocToken, void*) -> void* { + // The size of the scratch fits struct atfork_funcs in Musl pthread_atfork.c. + static char scratch[5 * sizeof(void*)]; + return size != sizeof(scratch) ? nullptr : scratch; + }; + allocator_shim::InsertAllocatorDispatch(&d); +#endif + int err = pthread_atfork(BeforeForkInParent, AfterForkInParent, AfterForkInChild); PA_CHECK(err == 0); + +#if defined(__MUSL__) + allocator_shim::RemoveAllocatorDispatchForTesting(&d); +#endif #endif // PA_BUILDFLAG(IS_LINUX) || PA_BUILDFLAG(IS_CHROMEOS) }