From 549c64cd86d4bbb909f7fbbcd741d274716ca4d8 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 29 Jun 2021 10:24:05 +0000 Subject: Add support for mallinfo2 with glibc 2.33 --- vespamalloc/src/tests/stacktrace/stacktrace.cpp | 21 ++++++++++---- vespamalloc/src/vespamalloc/malloc/overload.h | 37 ++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 9 deletions(-) (limited to 'vespamalloc') diff --git a/vespamalloc/src/tests/stacktrace/stacktrace.cpp b/vespamalloc/src/tests/stacktrace/stacktrace.cpp index f30e3c20f55..342aa7bc170 100644 --- a/vespamalloc/src/tests/stacktrace/stacktrace.cpp +++ b/vespamalloc/src/tests/stacktrace/stacktrace.cpp @@ -17,12 +17,22 @@ void * run(void * arg) } void verify_that_vespamalloc_datasegment_size_exists() { -#pragma GCC diagnostic push -#if __GNUC_PREREQ(2, 33) -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif +#if __GLIBC_PREREQ(2, 33) + struct mallinfo2 info = mallinfo2(); + printf("Malloc used %zm of memory\n", info.arena); + assert(info.arena >= 10 * 0x100000); + assert(info.arena < 10000 * 0x100000); + assert(info.fordblks == 0); + assert(info.fsmblks == 0); + assert(info.hblkhd == 0); + assert(info.hblks == 0); + assert(info.keepcost == 0); + assert(info.ordblks == 0); + assert(info.smblks == 0); + assert(info.uordblks == 0); + assert(info.usmblks == 0); +#else struct mallinfo info = mallinfo(); -#pragma GCC diagnostic push printf("Malloc used %dm of memory\n",info.arena); assert(info.arena >= 10); assert(info.arena < 10000); @@ -35,6 +45,7 @@ void verify_that_vespamalloc_datasegment_size_exists() { assert(info.smblks == 0); assert(info.uordblks == 0); assert(info.usmblks == 0); +#endif } int main(int argc, char *argv[]) diff --git a/vespamalloc/src/vespamalloc/malloc/overload.h b/vespamalloc/src/vespamalloc/malloc/overload.h index 1ec37c37aa1..191edfebc18 100644 --- a/vespamalloc/src/vespamalloc/malloc/overload.h +++ b/vespamalloc/src/vespamalloc/malloc/overload.h @@ -106,6 +106,23 @@ void operator delete[](void* ptr, std::size_t sz, std::align_val_t alignment) no extern "C" { +#if __GLIBC_PREREQ(2, 33) +struct mallinfo2 mallinfo2() __THROW __attribute__((visibility ("default"))); +struct mallinfo2 mallinfo2() __THROW { + struct mallinfo info; + info.arena = vespamalloc::_GmemP->dataSegment().dataSize(); + info.ordblks = 0; + info.smblks = 0; + info.hblks = 0; + info.hblkhd = 0; + info.usmblks = 0; + info.fsmblks = 0; + info.uordblks = 0; + info.fordblks = 0; + info.keepcost = 0; + return info; +} +#else struct mallinfo mallinfo() __THROW __attribute__((visibility ("default"))); struct mallinfo mallinfo() __THROW { struct mallinfo info; @@ -121,6 +138,7 @@ struct mallinfo mallinfo() __THROW { info.keepcost = 0; return info; } +#endif void * malloc(size_t sz) { return vespamalloc::createAllocator()->malloc(sz); @@ -136,6 +154,12 @@ void * realloc(void * ptr, size_t sz) return vespamalloc::createAllocator()->realloc(ptr, sz); } +void * reallocarray(void * ptr, size_t nemb, size_t sz) __THROW __attribute__((visibility ("default"))); +void * reallocarray(void * ptr, size_t nemb, size_t sz) __THROW +{ + return vespamalloc::createAllocator()->realloc(ptr, sz*nemb); +} + void* memalign(size_t align, size_t sz) __THROW __attribute__((visibility ("default"))); void* memalign(size_t align, size_t sz) __THROW { @@ -173,7 +197,6 @@ void *valloc(size_t size) __THROW return memalign(sysconf(_SC_PAGESIZE),size); } - void free(void * ptr) { if (ptr) { vespamalloc::_GmemP->free(ptr); } } @@ -187,7 +210,8 @@ size_t malloc_usable_size (void * ptr) __THROW { #ifdef __clang__ void* __libc_malloc(size_t sz) __THROW __attribute__((malloc, alloc_size(1))) ALIAS("malloc"); void* __libc_realloc(void* ptr, size_t sz) __THROW __attribute__((malloc, alloc_size(2))) ALIAS("realloc"); -void* __libc_calloc(size_t n, size_t sz) __THROW __attribute__((malloc, alloc_size(2))) ALIAS("calloc"); +void* __libc_reallocarray(void* ptr, size_t nemb, size_t sz) __THROW __attribute__((malloc, alloc_size(2,3))) ALIAS("reallocarray"); +void* __libc_calloc(size_t n, size_t sz) __THROW __attribute__((malloc, alloc_size(1,2))) ALIAS("calloc"); void cfree(void *) __THROW ALIAS("free"); void __libc_free(void* ptr) __THROW ALIAS("free"); #pragma clang diagnostic push @@ -197,15 +221,20 @@ void __libc_cfree(void* ptr) __THROW ALIAS("cfree"); #else void* __libc_malloc(size_t sz) __THROW __attribute__((leaf, malloc, alloc_size(1))) ALIAS("malloc"); void* __libc_realloc(void* ptr, size_t sz) __THROW __attribute__((leaf, malloc, alloc_size(2))) ALIAS("realloc"); -void* __libc_calloc(size_t n, size_t sz) __THROW __attribute__((leaf, malloc, alloc_size(2))) ALIAS("calloc"); +void* __libc_reallocarray(void* ptr, size_t nemb, size_t sz) __THROW __attribute__((leaf, malloc, alloc_size(2,3))) ALIAS("reallocarray"); +void* __libc_calloc(size_t n, size_t sz) __THROW __attribute__((leaf, malloc, alloc_size(1,2))) ALIAS("calloc"); void cfree(void *) __THROW __attribute__((leaf)) ALIAS("free"); void __libc_free(void* ptr) __THROW __attribute__((leaf)) ALIAS("free"); void __libc_cfree(void* ptr) __THROW __attribute__((leaf)) ALIAS("cfree"); #endif -struct mallinfo __libc_mallinfo() __THROW ALIAS("mallinfo"); size_t __libc_malloc_usable_size(void *ptr) __THROW ALIAS("malloc_usable_size"); void* __libc_memalign(size_t align, size_t s) __THROW __attribute__((leaf, malloc, alloc_size(2))) ALIAS("memalign"); int __posix_memalign(void** r, size_t a, size_t s) __THROW __nonnull((1)) ALIAS("posix_memalign"); +#if __GLIBC_PREREQ(2, 33) +struct mallinfo2 __libc_mallinfo2() __THROW ALIAS("mallinfo2"); +#else +struct mallinfo __libc_mallinfo() __THROW ALIAS("mallinfo"); +#endif #undef ALIAS } -- cgit v1.2.3