From d626d45cef28a0d1304e2959d3c94c9a94024e6e Mon Sep 17 00:00:00 2001 From: klzgrad Date: Wed, 9 Nov 2022 23:36:59 +0800 Subject: [PATCH] allocator: Fix __THROW and mallinfo for Musl --- .../src/partition_alloc/partition_root.cc | 7 ++++++- .../allocator_shim_default_dispatch_to_partition_alloc.cc | 2 +- .../src/partition_alloc/shim/allocator_shim_internals.h | 3 ++- .../shim/allocator_shim_override_libc_symbols.h | 6 ++++++ 4 files changed, 15 insertions(+), 3 deletions(-) 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 a0e8d36a94..bd1b5ddfe7 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 @@ -281,7 +281,12 @@ void PartitionAllocMallocInitOnce() { return; } -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if defined(__MUSL__) + // Musl calls malloc() in pthread_atfork(), resulting in a deadlock. + static_cast(BeforeForkInParent); + static_cast(AfterForkInParent); + static_cast(AfterForkInChild); +#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // When fork() is called, only the current thread continues to execute in the // child process. If the lock is held, but *not* by this thread when fork() is // called, we have a deadlock. diff --git a/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc index d724fd2f8e..5b8d1424d8 100644 --- a/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_default_dispatch_to_partition_alloc.cc @@ -743,7 +743,7 @@ SHIM_ALWAYS_EXPORT int mallopt(int cmd, int value) __THROW { #endif // !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_ANDROID) -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_LINUX) && !defined(__MUSL__) || BUILDFLAG(IS_CHROMEOS) SHIM_ALWAYS_EXPORT struct mallinfo mallinfo(void) __THROW { partition_alloc::SimplePartitionStatsDumper allocator_dumper; Allocator()->DumpStats("malloc", true, &allocator_dumper); diff --git a/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h b/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h index 2c1f2c695c..46ab0d1967 100644 --- a/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h +++ b/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h @@ -9,7 +9,8 @@ #if defined(__GNUC__) -#if BUILDFLAG(IS_POSIX) +// Musl does not provide sys/cdefs.h +#if BUILDFLAG(IS_POSIX) && !defined(__MUSL__) #include // for __THROW #endif diff --git a/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h b/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h index 624a44610e..ee1c419d82 100644 --- a/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h +++ b/src/base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_override_libc_symbols.h @@ -22,6 +22,12 @@ #include "base/allocator/partition_allocator/src/partition_alloc/shim/allocator_shim_internals.h" +// Musl does not specify anything for malloc() etc. +#if defined(__MUSL__) +#undef __THROW +#define __THROW +#endif + extern "C" { // WARNING: Whenever a new function is added there (which, surprisingly enough,