Author: eelco
Date: Thu Dec 15 12:32:08 2011
New Revision: 30906
URL: https://nixos.org/websvn/nix/?rev=30906&sc=1
Log:
* Buffer reads in FdSource. Together with write buffering, this
significantly cuts down the number of syscalls (e.g., for "nix-store
-qR /var/run/current-system" via the daemon, it reduced the number
of syscalls in the client from 29134 to 4766 and in the daemon from
44266 to 20666).
Modified:
nix/trunk/src/libutil/serialise.cc
nix/trunk/src/libutil/serialise.hh
Modified: nix/trunk/src/libutil/serialise.cc
==============================================================================
--- nix/trunk/src/libutil/serialise.cc Thu Dec 15 12:24:25 2011 (r30905)
+++ nix/trunk/src/libutil/serialise.cc Thu Dec 15 12:32:08 2011 (r30906)
@@ -2,6 +2,7 @@
#include "util.hh"
#include <cstring>
+#include <cerrno>
namespace nix {
@@ -38,7 +39,28 @@
void FdSource::operator () (unsigned char * data, unsigned int len)
{
- readFull(fd, data, len);
+ if (!buffer) buffer = new unsigned char[bufSize];
+
+ while (len) {
+ if (!bufPosIn) {
+ /* Read as much data as is available (up to the buffer
+ size). */
+ checkInterrupt();
+ ssize_t n = read(fd, (char *) buffer, bufSize);
+ if (n == -1) {
+ if (errno == EINTR) continue;
+ throw SysError("reading from file");
+ }
+ if (n == 0) throw EndOfFile("unexpected end-of-file");
+ bufPosIn = n;
+ }
+
+ /* Copy out the data in the buffer. */
+ size_t n = len > bufPosIn - bufPosOut ? bufPosIn - bufPosOut : len;
+ memcpy(data, buffer + bufPosOut, n);
+ data += n; bufPosOut += n; len -= n;
+ if (bufPosIn == bufPosOut) bufPosIn = bufPosOut = 0;
+ }
}
Modified: nix/trunk/src/libutil/serialise.hh
==============================================================================
--- nix/trunk/src/libutil/serialise.hh Thu Dec 15 12:24:25 2011 (r30905)
+++ nix/trunk/src/libutil/serialise.hh Thu Dec 15 12:32:08 2011 (r30906)
@@ -38,9 +38,7 @@
FdSink() : fd(-1), bufSize(32 * 1024), bufPos(0), buffer(0) { }
FdSink(int fd, unsigned int bufSize = 32 * 1024)
- : fd(fd), bufSize(bufSize), bufPos(0), buffer(0)
- {
- }
+ : fd(fd), bufSize(bufSize), bufPos(0), buffer(0) { }
~FdSink()
{
@@ -58,15 +56,17 @@
struct FdSource : Source
{
int fd;
+ unsigned int bufSize, bufPosIn, bufPosOut;
+ unsigned char * buffer;
- FdSource()
- {
- fd = -1;
- }
+ FdSource() : fd(-1), bufSize(32 * 1024), bufPosIn(0), bufPosOut(0),
buffer(0) { }
+
+ FdSource(int fd, unsigned int bufSize = 32 * 1024)
+ : fd(fd), bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(0) { }
- FdSource(int fd)
+ ~FdSource()
{
- this->fd = fd;
+ if (buffer) delete[] buffer;
}
void operator () (unsigned char * data, unsigned int len);
_______________________________________________
nix-commits mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-commits