>From 3ebc58cc4370567be7301e02b661a2fe5478d86c Mon Sep 17 00:00:00 2001 From: Anton Ovchinnikov Date: Thu, 11 Jul 2013 13:44:24 +0100 Subject: [PATCH] df: reduce memory usage when filtering mount entries Avoid Valgrind reports of "definitely lost" items and while at it, free all discarded mount entries to minimize the amount of memory used. * src/df.c (filter_mount_list): Use the newly exported free_mount_entry() from gnulib to free all mount entries as they're discarded. --- src/df.c | 30 +++++++++++++++++++++--------- 1 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/df.c b/src/df.c index bb11bb4..e018064 100644 --- a/src/df.c +++ b/src/df.c @@ -613,10 +613,11 @@ filter_mount_list (void) struct devlist *devlist_head = NULL; /* Sort all 'wanted' entries into the list devlist_head. */ - for (me = mount_list; me; me = me->me_next) + for (me = mount_list; me;) { struct stat buf; struct devlist *devlist; + struct mount_entry *discard_me = NULL; if (-1 == stat (me->me_mountdir, &buf)) { @@ -635,25 +636,36 @@ filter_mount_list (void) if (devlist) { + discard_me = me; + /* Let the shorter mountdir win. */ if (! strchr (devlist->me->me_devname, '/') || (strlen (devlist->me->me_mountdir) > strlen (me->me_mountdir))) { - /* FIXME: free ME - the others are also not free()d. */ + discard_me = devlist->me; devlist->me = me; } - continue; /* ... with the loop over the mount_list. */ } } } - /* Add the device number to the global list devlist. */ - devlist = xmalloc (sizeof *devlist); - devlist->me = me; - devlist->dev_num = buf.st_dev; - devlist->next = devlist_head; - devlist_head = devlist; + if (discard_me) + { + me = me->me_next; + free_mount_entry (discard_me); + } + else + { + /* Add the device number to the global list devlist. */ + devlist = xmalloc (sizeof *devlist); + devlist->me = me; + devlist->dev_num = buf.st_dev; + devlist->next = devlist_head; + devlist_head = devlist; + + me = me->me_next; + } } /* Finally rebuild the mount_list from the devlist. */ -- 1.7.7.6