From b33e85229d3ac78242d8bc597cfdaa282486743f Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Wed, 13 Jul 2016 06:03:37 -0400 Subject: Make Buffered{Source,Sink} move-safe --- src/libutil/serialise.cc | 27 ++++++--------------------- src/libutil/serialise.hh | 12 ++++++------ 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc index 5c45c890f7b6..776308cdf321 100644 --- a/src/libutil/serialise.cc +++ b/src/libutil/serialise.cc @@ -8,18 +8,9 @@ namespace nix { -BufferedSink::~BufferedSink() -{ - /* We can't call flush() here, because C++ for some insane reason - doesn't allow you to call virtual methods from a destructor. */ - assert(!bufPos); - delete[] buffer; -} - - void BufferedSink::operator () (const unsigned char * data, size_t len) { - if (!buffer) buffer = new unsigned char[bufSize]; + if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]); while (len) { /* Optimisation: bypass the buffer if the data exceeds the @@ -32,7 +23,7 @@ void BufferedSink::operator () (const unsigned char * data, size_t len) /* 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); + memcpy(buffer.get() + bufPos, data, n); data += n; bufPos += n; len -= n; if (bufPos == bufSize) flush(); } @@ -44,7 +35,7 @@ void BufferedSink::flush() if (bufPos == 0) return; size_t n = bufPos; bufPos = 0; // don't trigger the assert() in ~BufferedSink() - write(buffer, n); + write(buffer.get(), n); } @@ -95,21 +86,15 @@ void Source::operator () (unsigned char * data, size_t len) } -BufferedSource::~BufferedSource() -{ - delete[] buffer; -} - - size_t BufferedSource::read(unsigned char * data, size_t len) { - if (!buffer) buffer = new unsigned char[bufSize]; + if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]); - if (!bufPosIn) bufPosIn = readUnbuffered(buffer, bufSize); + if (!bufPosIn) bufPosIn = readUnbuffered(buffer.get(), bufSize); /* Copy out the data in the buffer. */ size_t n = len > bufPosIn - bufPosOut ? bufPosIn - bufPosOut : len; - memcpy(data, buffer + bufPosOut, n); + memcpy(data, buffer.get() + bufPosOut, n); bufPosOut += n; if (bufPosIn == bufPosOut) bufPosIn = bufPosOut = 0; return n; diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh index 892ec4aa36de..0139bed1cb9f 100644 --- a/src/libutil/serialise.hh +++ b/src/libutil/serialise.hh @@ -1,5 +1,7 @@ #pragma once +#include + #include "types.hh" #include "util.hh" @@ -25,11 +27,10 @@ struct Sink struct BufferedSink : Sink { size_t bufSize, bufPos; - unsigned char * buffer; + std::unique_ptr buffer; BufferedSink(size_t bufSize = 32 * 1024) - : bufSize(bufSize), bufPos(0), buffer(0) { } - ~BufferedSink(); + : bufSize(bufSize), bufPos(0), buffer(nullptr) { } void operator () (const unsigned char * data, size_t len) override; @@ -67,11 +68,10 @@ struct Source struct BufferedSource : Source { size_t bufSize, bufPosIn, bufPosOut; - unsigned char * buffer; + std::unique_ptr buffer; BufferedSource(size_t bufSize = 32 * 1024) - : bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(0) { } - ~BufferedSource(); + : bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(nullptr) { } size_t read(unsigned char * data, size_t len) override; -- cgit 1.4.1