This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[patch] Updated fix for BZ#208: mallinfo returns incomplete information
- From: ppluzhnikov at google dot com (Paul Pluzhnikov)
- To: libc-alpha at sourceware dot org
- Cc: ppluzhnikov at google dot com, Andreas Jaeger <aj at suse dot com>
- Date: Tue, 15 May 2012 09:50:47 -0700 (PDT)
- Subject: [patch] Updated fix for BZ#208: mallinfo returns incomplete information
Greetings,
As noted in http://sourceware.org/bugzilla/show_bug.cgi?id=208,
mallinfo() only returns information about the memory used in the main arena,
which is misleading at best.
Attached is the patch I mailed earlier:
http://cygwin.com/ml/libc-alpha/2011-08/msg00116.html,
rebased to current git trunk.
Tested on Linux/x86_64 and Linux/i686.
Please note: the patch violates coding style to match the rest of
the file. If converting to correct coding style is deemed desirable,
I will send a separate patch to do that.
Thanks,
--
Paul Pluzhnikov
2012-05-15 Paul Pluzhnikov <ppluzhnikov@google.com>
[BZ #208]
* malloc.c (int_mallinfo): Add parameter.
(__libc_mallinfo): Accumulate over all arenas.
(__malloc_stats): Adjust.
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 79cdc52..1dc739e 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -4515,10 +4515,9 @@ __malloc_usable_size(void* m)
------------------------------ mallinfo ------------------------------
*/
-static struct mallinfo
-int_mallinfo(mstate av)
+static void
+int_mallinfo(mstate av, struct mallinfo *m)
{
- struct mallinfo mi;
size_t i;
mbinptr b;
mchunkptr p;
@@ -4558,29 +4557,40 @@ int_mallinfo(mstate av)
}
}
- mi.smblks = nfastblocks;
- mi.ordblks = nblocks;
- mi.fordblks = avail;
- mi.uordblks = av->system_mem - avail;
- mi.arena = av->system_mem;
- mi.hblks = mp_.n_mmaps;
- mi.hblkhd = mp_.mmapped_mem;
- mi.fsmblks = fastavail;
- mi.keepcost = chunksize(av->top);
- mi.usmblks = mp_.max_total_mem;
- return mi;
+ m->smblks += nfastblocks;
+ m->ordblks += nblocks;
+ m->fordblks += avail;
+ m->uordblks += av->system_mem - avail;
+ m->arena += av->system_mem;
+ m->fsmblks += fastavail;
+ if (av == &main_arena)
+ {
+ m->hblks = mp_.n_mmaps;
+ m->hblkhd = mp_.mmapped_mem;
+ m->usmblks = mp_.max_total_mem;
+ m->keepcost = chunksize(av->top);
+ }
}
struct mallinfo __libc_mallinfo()
{
struct mallinfo m;
+ mstate ar_ptr;
if(__malloc_initialized < 0)
ptmalloc_init ();
- (void)mutex_lock(&main_arena.mutex);
- m = int_mallinfo(&main_arena);
- (void)mutex_unlock(&main_arena.mutex);
+
+ memset(&m, 0, sizeof (m));
+ ar_ptr = &main_arena;
+ do {
+ (void)mutex_lock(&ar_ptr->mutex);
+ int_mallinfo(ar_ptr, &m);
+ (void)mutex_unlock(&ar_ptr->mutex);
+
+ ar_ptr = ar_ptr->next;
+ } while (ar_ptr != &main_arena);
+
return m;
}
@@ -4593,7 +4603,6 @@ __malloc_stats()
{
int i;
mstate ar_ptr;
- struct mallinfo mi;
unsigned int in_use_b = mp_.mmapped_mem, system_b = in_use_b;
#if THREAD_STATS
long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
@@ -4605,8 +4614,11 @@ __malloc_stats()
int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
for (i=0, ar_ptr = &main_arena;; i++) {
+ struct mallinfo mi;
+
+ memset(&mi, 0, sizeof(mi));
(void)mutex_lock(&ar_ptr->mutex);
- mi = int_mallinfo(ar_ptr);
+ int_mallinfo(ar_ptr, &mi);
fprintf(stderr, "Arena %d:\n", i);
fprintf(stderr, "system bytes = %10u\n", (unsigned int)mi.arena);
fprintf(stderr, "in use bytes = %10u\n", (unsigned int)mi.uordblks);