mirror of
https://github.com/NixOS/nix
synced 2025-06-27 08:31:16 +02:00
* Buffer writes in FdSink. This significantly reduces the number of
system calls / context switches when dumping a NAR and in the worker protocol.
This commit is contained in:
parent
893cac1402
commit
3a48282b06
4 changed files with 51 additions and 15 deletions
|
@ -9,7 +9,30 @@ namespace nix {
|
|||
|
||||
void FdSink::operator () (const unsigned char * data, unsigned int len)
|
||||
{
|
||||
writeFull(fd, data, len);
|
||||
if (!buffer) buffer = new unsigned char[bufSize];
|
||||
|
||||
while (len) {
|
||||
/* Optimisation: bypass the buffer if the data exceeds the
|
||||
buffer size and there is no unflushed data. */
|
||||
if (bufPos == 0 && len >= bufSize) {
|
||||
writeFull(fd, data, len);
|
||||
break;
|
||||
}
|
||||
/* Otherwise, copy the bytes to the buffer. Flush the buffer
|
||||
when it's full. */
|
||||
size_t n = bufPos + len > bufSize ? bufSize - bufPos : len;
|
||||
memcpy(buffer + bufPos, data, n);
|
||||
data += n; bufPos += n; len -= n;
|
||||
if (bufPos == bufSize) flush();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void FdSink::flush()
|
||||
{
|
||||
if (fd == -1 || bufPos == 0) return;
|
||||
writeFull(fd, buffer, bufPos);
|
||||
bufPos = 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue