Message ID | 052197200141c321118b7766f5615a61f951e59f.1635515959.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Allow clean/smudge filters to handle huge files in the LLP64 data model | expand |
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes: > @@ -12,9 +15,19 @@ int cmd__genzeros(int argc, const char **argv) > > count = argc > 1 ? strtoimax(argv[1], NULL, 0) : -1; > > - while (count < 0 || count--) { > - if (putchar(0) == EOF) > + /* Writing out individual NUL bytes is slow... */ > + while (count < 0) > + if (write(1, zeros, ARRAY_SIZE(zeros)) < 0) > return -1; > + > + while (count > 0) { > + n = write(1, zeros, count < ARRAY_SIZE(zeros) ? > + count : ARRAY_SIZE(zeros)); > + > + if (n < 0) > + return -1; > + > + count -= n; > } > > return 0; This round looks OK to me.
diff --git a/t/helper/test-genzeros.c b/t/helper/test-genzeros.c index b1197e91a89..8ca988d6216 100644 --- a/t/helper/test-genzeros.c +++ b/t/helper/test-genzeros.c @@ -3,7 +3,10 @@ int cmd__genzeros(int argc, const char **argv) { + /* static, so that it is NUL-initialized */ + static const char zeros[256 * 1024]; intmax_t count; + ssize_t n; if (argc > 2) { fprintf(stderr, "usage: %s [<count>]\n", argv[0]); @@ -12,9 +15,19 @@ int cmd__genzeros(int argc, const char **argv) count = argc > 1 ? strtoimax(argv[1], NULL, 0) : -1; - while (count < 0 || count--) { - if (putchar(0) == EOF) + /* Writing out individual NUL bytes is slow... */ + while (count < 0) + if (write(1, zeros, ARRAY_SIZE(zeros)) < 0) return -1; + + while (count > 0) { + n = write(1, zeros, count < ARRAY_SIZE(zeros) ? + count : ARRAY_SIZE(zeros)); + + if (n < 0) + return -1; + + count -= n; } return 0;