From 4a3c4c298b13d7111dc5566210ed4dbc102733a9 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Mon, 28 Jun 2021 13:59:01 +0000 Subject: Use mallinfo to report vespamalloc heap size. --- vespamalloc/src/tests/stacktrace/stacktrace.cpp | 14 ++++++++++++- vespamalloc/src/vespamalloc/malloc/overload.h | 26 +++++++++++++++++------- vespamalloc/src/vespamalloc/malloc/vespamalloc.h | 20 ------------------ 3 files changed, 32 insertions(+), 28 deletions(-) delete mode 100644 vespamalloc/src/vespamalloc/malloc/vespamalloc.h (limited to 'vespamalloc/src') diff --git a/vespamalloc/src/tests/stacktrace/stacktrace.cpp b/vespamalloc/src/tests/stacktrace/stacktrace.cpp index e7c53fa5c3f..957f05d9b66 100644 --- a/vespamalloc/src/tests/stacktrace/stacktrace.cpp +++ b/vespamalloc/src/tests/stacktrace/stacktrace.cpp @@ -4,6 +4,7 @@ #include #include #include +#include void * run(void * arg) { @@ -16,7 +17,18 @@ void * run(void * arg) } void verify_that_vespamalloc_datasegment_size_exists() { - assert(dlsym(RTLD_NEXT, "vespamalloc_datasegment_size") != nullptr); + struct mallinfo info = mallinfo(); + printf("Malloc used %dm of memory\n",info.arena); + assert(info.arena == 24); + 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); } int main(int argc, char *argv[]) diff --git a/vespamalloc/src/vespamalloc/malloc/overload.h b/vespamalloc/src/vespamalloc/malloc/overload.h index f9c51582fb9..ca3a76b705b 100644 --- a/vespamalloc/src/vespamalloc/malloc/overload.h +++ b/vespamalloc/src/vespamalloc/malloc/overload.h @@ -5,6 +5,7 @@ #include #include #include +#include class CreateAllocator { @@ -105,9 +106,20 @@ void operator delete[](void* ptr, std::size_t sz, std::align_val_t alignment) no extern "C" { -unsigned long vespamalloc_datasegment_size() __attribute__((visibility ("default"))); -unsigned long vespamalloc_datasegment_size() { - return vespamalloc::_GmemP->dataSegment().dataSize(); +struct mallinfo mallinfo() __THROW __attribute__((visibility ("default"))); +struct mallinfo mallinfo() __THROW { + struct mallinfo info; + info.arena = (vespamalloc::_GmemP->dataSegment().dataSize() >> 20); // Note reporting in 1M blocks + 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; } void * malloc(size_t sz) { @@ -124,8 +136,8 @@ void * realloc(void * ptr, size_t sz) return vespamalloc::createAllocator()->realloc(ptr, sz); } -void* memalign(size_t align, size_t sz) __attribute__((visibility ("default"))); -void* memalign(size_t align, size_t sz) +void* memalign(size_t align, size_t sz) __THROW __attribute__((visibility ("default"))); +void* memalign(size_t align, size_t sz) __THROW { void *ptr(nullptr); size_t align_1(align - 1); @@ -137,7 +149,6 @@ void* memalign(size_t align, size_t sz) } int posix_memalign(void** ptr, size_t align, size_t sz) __THROW __nonnull((1)) __attribute__((visibility ("default"))); - int posix_memalign(void** ptr, size_t align, size_t sz) __THROW { int retval(0); @@ -186,7 +197,8 @@ void cfree(void *) __THROW __attribute__((leaf void __libc_free(void* ptr) __THROW __attribute__((leaf)) ALIAS("free"); void __libc_cfree(void* ptr) __THROW __attribute__((leaf)) ALIAS("cfree"); #endif -void* __libc_memalign(size_t align, size_t s) ALIAS("memalign"); +struct mallinfo __libc_mallinfo() __THROW ALIAS("mallinfo"); +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"); #undef ALIAS diff --git a/vespamalloc/src/vespamalloc/malloc/vespamalloc.h b/vespamalloc/src/vespamalloc/malloc/vespamalloc.h deleted file mode 100644 index 4dbadf8a26e..00000000000 --- a/vespamalloc/src/vespamalloc/malloc/vespamalloc.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -#pragma once - -/** - * Contains the interfaces that vespamalloc offers in addition to the standard - * allocation interfaces like malloc, calloc, free, new, delete, etc. - * Use dlsym(RTLD_NEXT, "function_name") to ensure the existence of the interface. - **/ - -extern "C" { - -/** - * Reports the amount of memory vespamalloc uses. It is actually the size of the datasegment. - * This is the peak memory usage during process lifetime, and does not differentiate between malloced or freed memory. - * This is cheap to call - **/ -unsigned long vespamalloc_datasegment_size(); - -} -- cgit v1.2.3