summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Jim Hill <gjthill@gmail.com>2015-05-31 11:16:45 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2015-08-10 12:51:13 -0700
commit3ebbd00cf3c5a7c6f90e2fed8adaf0c5145fb4ac (patch)
tree128975e73a85e64cc9ddb6db9896b7e5ec94d575
parentMerge branch 'maint-1.9' into maint-2.0 (diff)
downloadtgif-3ebbd00cf3c5a7c6f90e2fed8adaf0c5145fb4ac.tar.xz
strbuf_read(): skip unnecessary strbuf_grow() at eof
The loop in strbuf_read() uses xread() repeatedly while extending the strbuf until the call returns zero. If the buffer is sufficiently large to begin with, this results in xread() returning the remainder of the file to the end (returning non-zero), the loop extending the strbuf, and then making another call to xread() to have it return zero. By using read_in_full(), we can tell when the read reached the end of file: when it returns less than was requested, it's eof. This way we can avoid an extra iteration that allocates an extra 8kB that is never used. Signed-off-by: Jim Hill <gjthill@gmail.com> Reviewed-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--strbuf.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/strbuf.c b/strbuf.c
index ee96dcfb81..ede99d372f 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -348,19 +348,19 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint)
strbuf_grow(sb, hint ? hint : 8192);
for (;;) {
- ssize_t cnt;
+ ssize_t want = sb->alloc - sb->len - 1;
+ ssize_t got = read_in_full(fd, sb->buf + sb->len, want);
- cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1);
- if (cnt < 0) {
+ if (got < 0) {
if (oldalloc == 0)
strbuf_release(sb);
else
strbuf_setlen(sb, oldlen);
return -1;
}
- if (!cnt)
+ sb->len += got;
+ if (got < want)
break;
- sb->len += cnt;
strbuf_grow(sb, 8192);
}