Re: [PATCH 1/1] Improve progress display in kB range.
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:46:38
James Cloos [off-list ref] writes:
|> Therefore, in practice — and as I have witnessed several thousand times
|> without ever having seen a contrary example — display_throughput() is
|> called *durring* a download only when total & 0xFFF == 0xFFF.
Another possibility is an off-by-one error. The relevant part of fill()
looks like:
,----< excerpt from index-pack.c:fill() >
| do {
| ssize_t ret = xread(input_fd, input_buffer + input_len,
| sizeof(input_buffer) - input_len);
| if (ret <= 0) {
| if (!ret)
| die("early EOF");
| die("read error on input: %s", strerror(errno));
| }
| input_len += ret;
| if (from_stdin)
| display_throughput(progress, consumed_bytes + input_len);
| } while (input_len < min);
| return input_buffer;
| }
`----
if *(input_buffer + ret) is the last read octet rather than the next
empty octet, that would also explain what I see.After checking "ret" from xread(), input_len is incremented by that amount, and the next iteration gives "input_buffer + input_len" to xread(). If input_buffer[ret] _were_ the last octet read, your loop would be discarding that octet when you call more than one xread() to fill the buffer.