summaryrefslogtreecommitdiff
path: root/src/ls.c
diff options
context:
space:
mode:
authorKamil Dudka <kdudka@redhat.com>2008-07-30 14:31:50 +0200
committerJim Meyering <meyering@redhat.com>2008-08-01 08:36:38 +0200
commit8d974b00fbbc2025de63e1e6d54827648fefa1c4 (patch)
treebff56540d745da7ec4287455eaf3ad119bae5441 /src/ls.c
parentb44f5f74aa1cb209720cbb2cd60ecd47975397ab (diff)
downloadcoreutils-8d974b00fbbc2025de63e1e6d54827648fefa1c4.tar.xz
ls -U1 now uses constant memory
When printing one name per line and not sorting, ls now uses constant memory per directory, no matter how many files are in the directory. * ls.c (print_dir): Print each file name immediately, when possible. * NEWS: Mention the improvement.
Diffstat (limited to 'src/ls.c')
-rw-r--r--src/ls.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/ls.c b/src/ls.c
index 4b69f7d22..a661c063f 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -2402,6 +2402,20 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
#endif
total_blocks += gobble_file (next->d_name, type, D_INO (next),
false, name);
+
+ /* In this narrow case, print out each name right away, so
+ ls uses constant memory while processing the entries of
+ this directory. Useful when there are many (millions)
+ of entries in a directory. */
+ if (format == one_per_line && sort_type == sort_none)
+ {
+ /* We must call sort_files in spite of
+ "sort_type == sort_none" for its initialization
+ of the sorted_file vector. */
+ sort_files ();
+ print_current_files ();
+ clear_files ();
+ }
}
}
else if (errno != 0)