зеркало из https://github.com/microsoft/git.git
Merge branch 'ds/clarify-hashwrite'
The hashwrite() API uses a buffering mechanism to avoid calling write(2) too frequently. This logic has been refactored to be easier to understand. * ds/clarify-hashwrite: csum-file: make hashwrite() more readable
This commit is contained in:
Коммит
573c5e50ab
33
csum-file.c
33
csum-file.c
|
@ -89,32 +89,35 @@ int finalize_hashfile(struct hashfile *f, unsigned char *result, unsigned int fl
|
|||
void hashwrite(struct hashfile *f, const void *buf, unsigned int count)
|
||||
{
|
||||
while (count) {
|
||||
unsigned offset = f->offset;
|
||||
unsigned left = sizeof(f->buffer) - offset;
|
||||
unsigned left = sizeof(f->buffer) - f->offset;
|
||||
unsigned nr = count > left ? left : count;
|
||||
const void *data;
|
||||
|
||||
if (f->do_crc)
|
||||
f->crc32 = crc32(f->crc32, buf, nr);
|
||||
|
||||
if (nr == sizeof(f->buffer)) {
|
||||
/* process full buffer directly without copy */
|
||||
data = buf;
|
||||
/*
|
||||
* Flush a full batch worth of data directly
|
||||
* from the input, skipping the memcpy() to
|
||||
* the hashfile's buffer. In this block,
|
||||
* f->offset is necessarily zero.
|
||||
*/
|
||||
the_hash_algo->update_fn(&f->ctx, buf, nr);
|
||||
flush(f, buf, nr);
|
||||
} else {
|
||||
memcpy(f->buffer + offset, buf, nr);
|
||||
data = f->buffer;
|
||||
/*
|
||||
* Copy to the hashfile's buffer, flushing only
|
||||
* if it became full.
|
||||
*/
|
||||
memcpy(f->buffer + f->offset, buf, nr);
|
||||
f->offset += nr;
|
||||
left -= nr;
|
||||
if (!left)
|
||||
hashflush(f);
|
||||
}
|
||||
|
||||
count -= nr;
|
||||
offset += nr;
|
||||
buf = (char *) buf + nr;
|
||||
left -= nr;
|
||||
if (!left) {
|
||||
the_hash_algo->update_fn(&f->ctx, data, offset);
|
||||
flush(f, data, offset);
|
||||
offset = 0;
|
||||
}
|
||||
f->offset = offset;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче