diff options
author | Anton Ovchinnikov <revolver112@gmail.com> | 2013-07-11 13:44:24 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2013-07-11 13:44:24 +0100 |
commit | 3ebc58cc4370567be7301e02b661a2fe5478d86c (patch) | |
tree | f201af65a73f99fde918edbf2912d8695c103420 /src | |
parent | 27712763e34b8569012f39d18aaf698e2840ec3f (diff) | |
download | coreutils-3ebc58cc4370567be7301e02b661a2fe5478d86c.tar.xz |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/df.c | 30 |
1 files changed, 21 insertions, 9 deletions
@@ -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. */ |