diff --git a/include/haproxy/compat.h b/include/haproxy/compat.h index 84cdbe0d5..19a531786 100644 --- a/include/haproxy/compat.h +++ b/include/haproxy/compat.h @@ -282,6 +282,12 @@ typedef struct { } empty_t; #define HA_HAVE_FAST_MALLOC #endif +/* glibc 2.33 provides mallinfo2() that overcomes mallinfo()'s type limitations */ +#if (defined(__GNU_LIBRARY__) && (__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 33)) +#include +#define HA_HAVE_MALLINFO2 +#endif + /* FreeBSD also has malloc_usable_size() but it requires malloc_np.h */ #if defined(USE_MEMORY_PROFILING) && defined(__FreeBSD__) && (__FreeBSD_version >= 700002) #include diff --git a/src/pool.c b/src/pool.c index 94bbb8355..ad63d9ba3 100644 --- a/src/pool.c +++ b/src/pool.c @@ -58,12 +58,24 @@ static void trim_all_pools(void) */ static void detect_allocator(void) { +#ifdef HA_HAVE_MALLINFO2 + struct mallinfo2 mi1, mi2; +#else struct mallinfo mi1, mi2; +#endif void *ptr; +#ifdef HA_HAVE_MALLINFO2 + mi1 = mallinfo2(); +#else mi1 = mallinfo(); +#endif ptr = DISGUISE(malloc(1)); +#ifdef HA_HAVE_MALLINFO2 + mi2 = mallinfo2(); +#else mi2 = mallinfo(); +#endif free(DISGUISE(ptr)); using_libc_allocator = !!memcmp(&mi1, &mi2, sizeof(mi1));