Add mallinfo2 function

This commit is contained in:
Mateusz Jakub Fila 2023-12-07 14:10:51 +01:00
parent a9b734e3fa
commit b8e75ae6fe
12 changed files with 82 additions and 5 deletions

View File

@ -168,6 +168,7 @@ check_c_source_compiles("#include <stdlib.h>
set(CMAKE_EXTRA_INCLUDE_FILES "malloc.h")
check_type_size("struct mallinfo" STRUCT_MALLINFO LANGUAGE CXX)
check_type_size("struct mallinfo2" STRUCT_MALLINFO2 LANGUAGE CXX)
set(CMAKE_EXTRA_INCLUDE_FILES "elf.h")
check_type_size("Elf32_Versym" ELF32_VERSYM LANGUAGE CXX) # for vdso_support.h
set(CMAKE_EXTRA_INCLUDE_FILES)
@ -214,6 +215,12 @@ else()
set(HAVE_STRUCT_MALLINFO 0)
endif()
if(HAVE_STRUCT_MALLINFO2)
set(HAVE_STRUCT_MALLINFO2 1)
else()
set(HAVE_STRUCT_MALLINFO2 0)
endif()
# We hardcode HAVE_MMAP to 1. There are no interesting systems anymore
# without functional mmap. And our windows (except mingw) builds
# aren't using autoconf. So we keep HAVE_MMAP define, but only to

View File

@ -68,7 +68,7 @@ if HAVE_OBJCOPY_WEAKEN
WEAKEN = $(OBJCOPY) -W malloc -W free -W realloc -W calloc -W cfree \
-W memalign -W posix_memalign -W valloc -W pvalloc \
-W aligned_alloc \
-W malloc_stats -W mallopt -W mallinfo -W nallocx \
-W malloc_stats -W mallopt -W mallinfo -W mallinfo2 -W nallocx \
-W _Znwm -W _ZnwmRKSt9nothrow_t -W _Znam -W _ZnamRKSt9nothrow_t \
-W _ZdlPv -W _ZdaPv \
-W __Znwm -W __ZnwmRKSt9nothrow_t -W __Znam -W __ZnamRKSt9nothrow_t \

View File

@ -128,6 +128,9 @@
/* Define to 1 if the system has the type `struct mallinfo'. */
#cmakedefine HAVE_STRUCT_MALLINFO
/* Define to 1 if the system has the type `struct mallinfo2'. */
#cmakedefine HAVE_STRUCT_MALLINFO2
/* Define to 1 if you have the <sys/cdefs.h> header file. */
#cmakedefine HAVE_SYS_CDEFS_H

View File

@ -48,7 +48,7 @@
#define TC_VERSION_STRING "gperftools @PROJECT_VERSION@"
/* For struct mallinfo, if it's defined. */
#if @HAVE_STRUCT_MALLINFO@
#if @HAVE_STRUCT_MALLINFO@ || @HAVE_STRUCT_MALLINFO2@
# include <malloc.h>
#endif
@ -107,6 +107,9 @@ extern "C" {
#if @HAVE_STRUCT_MALLINFO@
PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHROW;
#endif
#if @HAVE_STRUCT_MALLINFO2@
PERFTOOLS_DLL_DECL struct mallinfo2 tc_mallinfo2(void) PERFTOOLS_NOTHROW;
#endif
/*
* This is an alias for MallocExtension::instance()->GetAllocatedSize().

View File

@ -250,6 +250,7 @@ AC_MSG_RESULT($ac_cv___attribute__aligned_fn)
# TODO(csilvers): we could remove a lot when WITH_CPU_PROFILER etc is "no".
AC_CHECK_TYPES([struct mallinfo],,, [#include <malloc.h>])
AC_CHECK_TYPES([struct mallinfo2],,, [#include <malloc.h>])
AC_CHECK_TYPES([Elf32_Versym],,, [#include <elf.h>]) # for vdso_support.h
AC_CHECK_FUNCS(sbrk) # for tcmalloc to get memory
AC_CHECK_FUNCS(__sbrk) # for tcmalloc to get memory
@ -297,6 +298,12 @@ else
AC_SUBST(ac_cv_have_struct_mallinfo, 0)
fi
if test "$ac_cv_type_struct_mallinfo2" = yes; then
AC_SUBST(ac_cv_have_struct_mallinfo2, 1) # gperftools/tcmalloc.h needs this
else
AC_SUBST(ac_cv_have_struct_mallinfo2, 0)
fi
# We hardcode HAVE_MMAP to 1. There are no interesting systems anymore
# without functional mmap. And our windows (except mingw) builds
# aren't using autoconf. So we keep HAVE_MMAP define, but only to

View File

@ -37,8 +37,8 @@
#include <fcntl.h>
#endif
#include <inttypes.h>
// We only need malloc.h for struct mallinfo.
#ifdef HAVE_STRUCT_MALLINFO
// We only need malloc.h for structs mallinfo and mallinfo2.
#if defined(HAVE_STRUCT_MALLINFO) || defined(HAVE_STRUCT_MALLINFO2)
// Malloc can be in several places on older versions of OS X.
# if defined(HAVE_MALLOC_H)
# include <malloc.h>
@ -1577,6 +1577,12 @@ extern "C" PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHRO
}
#endif
#ifdef HAVE_STRUCT_MALLINFO2
extern "C" PERFTOOLS_DLL_DECL struct mallinfo2 tc_mallinfo2(void) PERFTOOLS_NOTHROW {
return do_mallinfo2();
}
#endif
extern "C" PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) PERFTOOLS_NOTHROW {
return MallocExtension::instance()->GetAllocatedSize(ptr);
}

View File

@ -48,7 +48,7 @@
#define TC_VERSION_STRING "gperftools @TC_VERSION_MAJOR@.@TC_VERSION_MINOR@@TC_VERSION_PATCH@"
/* For struct mallinfo, if it's defined. */
#if @ac_cv_have_struct_mallinfo@
#if @ac_cv_have_struct_mallinfo@ || @ac_cv_have_struct_mallinfo2@
# include <malloc.h>
#endif
@ -107,6 +107,9 @@ extern "C" {
#if @ac_cv_have_struct_mallinfo@
PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHROW;
#endif
#if @ac_cv_have_struct_mallinfo2@
PERFTOOLS_DLL_DECL struct mallinfo2 tc_mallinfo2(void) PERFTOOLS_NOTHROW;
#endif
/*
* This is an alias for MallocExtension::instance()->GetAllocatedSize().

View File

@ -50,6 +50,9 @@ extern "C" {
int __mallopt__(int cmd, int value) __THROW ALIAS(tc_mallopt);
#ifdef HAVE_STRUCT_MALLINFO
struct mallinfo __mallinfo__(void) __THROW ALIAS(tc_mallinfo);
#endif
#ifdef HAVE_STRUCT_MALLINFO2
struct mallinfo2 __mallinfo2__(void) __THROW ALIAS(tc_mallinfo2);
#endif
void __malloc_init__(void) { tc_free(tc_malloc(1));}
void* __malloc_prefork_lock__(void) { /* nothing to lock */ }

View File

@ -234,6 +234,9 @@ extern "C" {
#endif
#ifdef HAVE_STRUCT_MALLINFO
struct mallinfo mallinfo(void) __THROW ALIAS(tc_mallinfo);
#endif
#ifdef HAVE_STRUCT_MALLINFO2
struct mallinfo2 mallinfo2(void) __THROW ALIAS(tc_mallinfo2);
#endif
size_t malloc_size(void* p) __THROW ALIAS(tc_malloc_size);
#if defined(__ANDROID__)

View File

@ -119,6 +119,9 @@ extern "C" {
int mallopt(int cmd, int v) { return tc_mallopt(cmd, v); }
#ifdef HAVE_STRUCT_MALLINFO
struct mallinfo mallinfo(void) { return tc_mallinfo(); }
#endif
#ifdef HAVE_STRUCT_MALLINFO2
struct mallinfo2 mallinfo2(void) { return tc_mallinfo2(); }
#endif
size_t malloc_size(void* p) { return tc_malloc_size(p); }
size_t malloc_usable_size(void* p) { return tc_malloc_size(p); }

View File

@ -217,6 +217,10 @@ extern "C" {
struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHROW
ATTRIBUTE_SECTION(google_malloc);
#endif
#ifdef HAVE_STRUCT_MALLINFO2
struct mallinfo2 tc_mallinfo2(void) PERFTOOLS_NOTHROW
ATTRIBUTE_SECTION(google_malloc);
#endif
void* tc_new(size_t size)
ATTRIBUTE_SECTION(google_malloc);
@ -1697,6 +1701,32 @@ inline struct mallinfo do_mallinfo() {
}
#endif // HAVE_STRUCT_MALLINFO
#ifdef HAVE_STRUCT_MALLINFO2
inline struct mallinfo2 do_mallinfo2() {
TCMallocStats stats;
ExtractStats(&stats, NULL, NULL, NULL);
// Just some of the fields are filled in.
struct mallinfo2 info;
memset(&info, 0, sizeof(info));
info.arena = static_cast<size_t>(stats.pageheap.system_bytes);
info.fsmblks = static_cast<size_t>(stats.thread_bytes
+ stats.central_bytes
+ stats.transfer_bytes);
info.fordblks = static_cast<size_t>(stats.pageheap.free_bytes +
stats.pageheap.unmapped_bytes);
info.uordblks = static_cast<size_t>(stats.pageheap.system_bytes
- stats.thread_bytes
- stats.central_bytes
- stats.transfer_bytes
- stats.pageheap.free_bytes
- stats.pageheap.unmapped_bytes);
return info;
}
#endif // HAVE_STRUCT_MALLINFO2
} // end unnamed namespace
// As promised, the definition of this function, declared above.
@ -2215,6 +2245,12 @@ extern "C" PERFTOOLS_DLL_DECL struct mallinfo tc_mallinfo(void) PERFTOOLS_NOTHRO
}
#endif
#ifdef HAVE_STRUCT_MALLINFO2
extern "C" PERFTOOLS_DLL_DECL struct mallinfo2 tc_mallinfo2(void) PERFTOOLS_NOTHROW {
return do_mallinfo2();
}
#endif
extern "C" PERFTOOLS_DLL_DECL size_t tc_malloc_size(void* ptr) PERFTOOLS_NOTHROW {
return MallocExtension::instance()->GetAllocatedSize(ptr);
}

View File

@ -145,6 +145,9 @@
/* Define to 1 if the system has the type `struct mallinfo'. */
/* #undef HAVE_STRUCT_MALLINFO */
/* Define to 1 if the system has the type `struct mallinfo2'. */
/* #undef HAVE_STRUCT_MALLINFO2 */
/* Define to 1 if you have the <sys/cdefs.h> header file. */
/* #undef HAVE_SYS_CDEFS_H */