@@ -192,6 +192,7 @@ AC_HAVE_STATFS_FLAGS
AC_HAVE_MAP_SYNC
AC_HAVE_DEVMAPPER
AC_HAVE_MALLINFO
+AC_HAVE_MALLINFO2
AC_PACKAGE_WANT_ATTRIBUTES_H
AC_HAVE_LIBATTR
if test "$enable_scrub" = "yes"; then
@@ -115,6 +115,7 @@ HAVE_STATFS_FLAGS = @have_statfs_flags@
HAVE_MAP_SYNC = @have_map_sync@
HAVE_DEVMAPPER = @have_devmapper@
HAVE_MALLINFO = @have_mallinfo@
+HAVE_MALLINFO2 = @have_mallinfo2@
HAVE_LIBATTR = @have_libattr@
HAVE_LIBICU = @have_libicu@
HAVE_OPENAT = @have_openat@
@@ -367,6 +367,24 @@ AC_DEFUN([AC_HAVE_MALLINFO],
AC_SUBST(have_mallinfo)
])
+#
+# Check if we have a mallinfo2 libc call
+#
+AC_DEFUN([AC_HAVE_MALLINFO2],
+ [ AC_MSG_CHECKING([for mallinfo2 ])
+ AC_TRY_COMPILE([
+#include <malloc.h>
+ ], [
+ struct mallinfo2 test;
+
+ test.arena = 0; test.hblkhd = 0; test.uordblks = 0; test.fordblks = 0;
+ test = mallinfo2();
+ ], have_mallinfo2=yes
+ AC_MSG_RESULT(yes),
+ AC_MSG_RESULT(no))
+ AC_SUBST(have_mallinfo2)
+ ])
+
#
# Check if we have a openat call
#
@@ -77,6 +77,10 @@ ifeq ($(HAVE_MALLINFO),yes)
LCFLAGS += -DHAVE_MALLINFO
endif
+ifeq ($(HAVE_MALLINFO2),yes)
+LCFLAGS += -DHAVE_MALLINFO2
+endif
+
ifeq ($(HAVE_SYNCFS),yes)
LCFLAGS += -DHAVE_SYNCFS
endif
@@ -282,6 +282,34 @@ phase_start(
return error;
}
+static inline unsigned long long
+kbytes(unsigned long long x)
+{
+ return (x + 1023) / 1024;
+}
+
+static void
+report_mem_usage(
+ const char *phase,
+ const struct phase_rusage *pi)
+{
+#if defined(HAVE_MALLINFO2) || defined(HAVE_MALLINFO)
+# ifdef HAVE_MALLINFO2
+ struct mallinfo2 mall_now = mallinfo2();
+# else
+ struct mallinfo mall_now = mallinfo();
+# endif
+ fprintf(stdout, _("%sMemory used: %lluk/%lluk (%lluk/%lluk), "),
+ phase,
+ kbytes(mall_now.arena), kbytes(mall_now.hblkhd),
+ kbytes(mall_now.uordblks), kbytes(mall_now.fordblks));
+#else
+ fprintf(stdout, _("%sMemory used: %lluk, "),
+ phase,
+ kbytes(((char *) sbrk(0)) - ((char *) pi->brk_start)));
+#endif
+}
+
/* Report usage stats. */
static int
phase_end(
@@ -289,9 +317,6 @@ phase_end(
unsigned int phase)
{
struct rusage ruse_now;
-#ifdef HAVE_MALLINFO
- struct mallinfo mall_now;
-#endif
struct timeval time_now;
char phasebuf[DESCR_BUFSZ];
double dt;
@@ -323,21 +348,7 @@ phase_end(
else
phasebuf[0] = 0;
-#define kbytes(x) (((unsigned long)(x) + 1023) / 1024)
-#ifdef HAVE_MALLINFO
-
- mall_now = mallinfo();
- fprintf(stdout, _("%sMemory used: %luk/%luk (%luk/%luk), "),
- phasebuf,
- kbytes(mall_now.arena), kbytes(mall_now.hblkhd),
- kbytes(mall_now.uordblks), kbytes(mall_now.fordblks));
-#else
- fprintf(stdout, _("%sMemory used: %luk, "),
- phasebuf,
- (unsigned long) kbytes(((char *) sbrk(0)) -
- ((char *) pi->brk_start)));
-#endif
-#undef kbytes
+ report_mem_usage(phasebuf, pi);
fprintf(stdout, _("time: %5.2f/%5.2f/%5.2fs\n"),
timeval_subtract(&time_now, &pi->time),