Author: eelco
Date: Fri Dec 16 21:29:46 2011
New Revision: 30943
URL: https://nixos.org/websvn/nix/?rev=30943&sc=1

Log:
* Avoid expensive conversions from char arrays to STL strings.

Modified:
   nix/trunk/src/libutil/serialise.cc
   nix/trunk/src/libutil/serialise.hh
   nix/trunk/src/nix-worker/nix-worker.cc

Modified: nix/trunk/src/libutil/serialise.cc
==============================================================================
--- nix/trunk/src/libutil/serialise.cc  Fri Dec 16 19:55:48 2011        (r30942)
+++ nix/trunk/src/libutil/serialise.cc  Fri Dec 16 21:29:46 2011        (r30943)
@@ -149,15 +149,20 @@
 }
 
 
-void writeString(const string & s, Sink & sink)
+void writeString(const unsigned char * buf, size_t len, Sink & sink)
 {
-    size_t len = s.length();
     writeInt(len, sink);
-    sink((const unsigned char *) s.c_str(), len);
+    sink(buf, len);
     writePadding(len, sink);
 }
 
 
+void writeString(const string & s, Sink & sink)
+{
+    writeString((const unsigned char *) s.c_str(), s.size(), sink);
+}
+
+
 void writeStringSet(const StringSet & ss, Sink & sink)
 {
     writeInt(ss.size(), sink);
@@ -208,6 +213,16 @@
 }
 
 
+size_t readString(unsigned char * buf, size_t max, Source & source)
+{
+    size_t len = readInt(source);
+    if (len > max) throw Error("string is too long");
+    source(buf, len);
+    readPadding(len, source);
+    return len;
+}
+
+ 
 string readString(Source & source)
 {
     size_t len = readInt(source);

Modified: nix/trunk/src/libutil/serialise.hh
==============================================================================
--- nix/trunk/src/libutil/serialise.hh  Fri Dec 16 19:55:48 2011        (r30942)
+++ nix/trunk/src/libutil/serialise.hh  Fri Dec 16 21:29:46 2011        (r30943)
@@ -114,12 +114,14 @@
 void writePadding(size_t len, Sink & sink);
 void writeInt(unsigned int n, Sink & sink);
 void writeLongLong(unsigned long long n, Sink & sink);
+void writeString(const unsigned char * buf, size_t len, Sink & sink);
 void writeString(const string & s, Sink & sink);
 void writeStringSet(const StringSet & ss, Sink & sink);
 
 void readPadding(size_t len, Source & source);
 unsigned int readInt(Source & source);
 unsigned long long readLongLong(Source & source);
+size_t readString(unsigned char * buf, size_t max, Source & source);
 string readString(Source & source);
 StringSet readStringSet(Source & source);
 

Modified: nix/trunk/src/nix-worker/nix-worker.cc
==============================================================================
--- nix/trunk/src/nix-worker/nix-worker.cc      Fri Dec 16 19:55:48 2011        
(r30942)
+++ nix/trunk/src/nix-worker/nix-worker.cc      Fri Dec 16 21:29:46 2011        
(r30943)
@@ -56,7 +56,7 @@
     if (canSendStderr && myPid == getpid()) {
         try {
             writeInt(STDERR_NEXT, to);
-            writeString(string((char *) buf, count), to);
+            writeString(buf, count, to);
             to.flush();
         } catch (...) {
             /* Write failed; that means that the other side is
@@ -205,7 +205,7 @@
     virtual void operator () (const unsigned char * data, size_t len)
     {
         writeInt(STDERR_WRITE, to);
-        writeString(string((const char *) data, len), to);
+        writeString(data, len, to);
     }
 };
 
@@ -224,16 +224,11 @@
         writeInt(STDERR_READ, to);
         writeInt(len, to);
         to.flush();
-        string s = readString(from); // !!! inefficient
+        size_t n = readString(data, len, from);
 
         startWork();
-
-        if (s.empty()) throw EndOfFile("unexpected end-of-file");
-        if (s.size() > len) throw Error("client sent too much data");
-
-        memcpy(data, (const unsigned char *) s.c_str(), s.size());
-
-        return s.size();
+        if (n == 0) throw EndOfFile("unexpected end-of-file");
+        return n;
     }
 };
 
_______________________________________________
nix-commits mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-commits

Reply via email to