From 5d0ed54bc22a196be5f0062d328ee662dea64bbb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Mon, 12 Apr 2021 10:44:23 +0200
Subject: [PATCH] EFUNs: Use mallinfo2(3C) if available.

Fixes warnings on versions of Linux where mallinfo(3C) has
been deprecated.
---
 src/builtin_functions.c | 16 +++++++++++++++-
 src/configure.in        |  1 +
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 4843ac1784..1dcdf5d627 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -7459,6 +7459,8 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
   struct svalue *ss;
 #ifdef USE_DL_MALLOC
   struct mallinfo mi = dlmallinfo();
+#elif HAVE_MALLINFO2
+  struct mallinfo2 mi = mallinfo2();
 #elif HAVE_MALLINFO
   struct mallinfo mi = mallinfo();
 #endif
@@ -7470,11 +7472,14 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
    * statistics from our bundled Doug Lea malloc, and not the
    * underlying system malloc. Ideally we should include both. */
 
-#if defined(HAVE_MALLINFO) || defined(USE_DL_MALLOC)
+#if defined(HAVE_MALLINFO2) || defined(HAVE_MALLINFO) || defined(USE_DL_MALLOC)
 
   push_text("num_malloc_blocks");
   push_ulongest(1 + mi.hblks);	/* 1 for the arena. */
   push_text("malloc_block_bytes");
+#ifdef HAVE_MALLINFO2
+  size = mi.arena + mi.hblkhd;
+#else
   if (mi.arena < 0) {
     /* Kludge for broken Linux libc, where the fields are ints.
      *
@@ -7499,11 +7504,15 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
   } else {
     size += mi.hblkhd;
   }
+#endif
   push_ulongest(size);
 
   push_text("num_malloc");
   push_ulongest(mi.ordblks + mi.smblks);
   push_text("malloc_bytes");
+#ifdef HAVE_MALLINFO2
+  size = mi.uordblks + mi.usmblks;
+#else
   if (mi.uordblks < 0) {
     size = (unsigned int)mi.uordblks;
   } else {
@@ -7517,11 +7526,15 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
       size += mi.usmblks;
     }
   }
+#endif
   push_ulongest(size);
 
   push_text("num_free_blocks");
   push_int(1);
   push_text("free_block_bytes");
+#ifdef HAVE_MALLINFO2
+  size = mi.fsmblks + mi.fordblks;
+#else
   if (mi.fsmblks < 0) {
     size = (unsigned int)mi.fsmblks;
   } else {
@@ -7532,6 +7545,7 @@ PMOD_EXPORT void f__memory_usage(INT32 args)
   } else {
     size += mi.fordblks;
   }
+#endif
   push_ulongest(size);
 
 #endif
diff --git a/src/configure.in b/src/configure.in
index 989bee5a7d..a9aeb55224 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -4584,6 +4584,7 @@ AC_CHECK_FUNCS( \
  gmtime_s \
  strptime \
  mallinfo \
+ mallinfo2 \
  mallopt \
  ptrace \
  setrlimit \
-- 
GitLab