summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/proton.cpp8
-rw-r--r--vespamalloc/src/tests/stacktrace/stacktrace.cpp21
-rw-r--r--vespamalloc/src/vespamalloc/malloc/overload.h37
3 files changed, 53 insertions, 13 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/server/proton.cpp b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
index 9c5438825b2..adae323c1d9 100644
--- a/searchcore/src/vespa/searchcore/proton/server/proton.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/proton.cpp
@@ -767,15 +767,15 @@ Proton::updateMetrics(const metrics::MetricLockGuard &)
metrics.resourceUsage.openFileDescriptors.set(FastOS_File::count_open_files());
metrics.resourceUsage.feedingBlocked.set((usageFilter.acceptWriteOperation() ? 0.0 : 1.0));
#ifdef __linux__
-#pragma GCC diagnostic push
#if __GLIBC_PREREQ(2, 33)
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
+ struct mallinfo2 mallocInfo = mallinfo2();
+ metrics.resourceUsage.mallocArena.set(mallocInfo.arena);
+#else
struct mallinfo mallocInfo = mallinfo();
-#pragma GCC diagnostic pop
// Vespamalloc reports arena in 1M blocks as an 'int' is too small.
// If we use something else than vespamalloc this must be changed.
metrics.resourceUsage.mallocArena.set(uint64_t(mallocInfo.arena) * 1_Mi);
+#endif
#else
metrics.resourceUsage.mallocArena.set(UINT64_C(0));
#endif
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
}