forked from lix-project/lix
Eliminate some large string copying
This commit is contained in:
parent
ce113c32d2
commit
42bc395b63
|
@ -28,7 +28,7 @@ BinaryCacheStore::BinaryCacheStore(std::shared_ptr<Store> localStore,
|
||||||
|
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
sink << narVersionMagic1;
|
sink << narVersionMagic1;
|
||||||
narMagic = sink.s;
|
narMagic = *sink.s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BinaryCacheStore::init()
|
void BinaryCacheStore::init()
|
||||||
|
@ -200,14 +200,16 @@ Paths BinaryCacheStore::importPaths(bool requireSignature, Source & source,
|
||||||
struct TeeSource : Source
|
struct TeeSource : Source
|
||||||
{
|
{
|
||||||
Source & readSource;
|
Source & readSource;
|
||||||
std::string data;
|
ref<std::string> data;
|
||||||
TeeSource(Source & readSource) : readSource(readSource)
|
TeeSource(Source & readSource)
|
||||||
|
: readSource(readSource)
|
||||||
|
, data(make_ref<std::string>())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
size_t read(unsigned char * data, size_t len)
|
size_t read(unsigned char * data, size_t len)
|
||||||
{
|
{
|
||||||
size_t n = readSource.read(data, len);
|
size_t n = readSource.read(data, len);
|
||||||
this->data.append((char *) data, n);
|
this->data->append((char *) data, n);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -257,7 +259,7 @@ Path BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
||||||
Hash h;
|
Hash h;
|
||||||
if (recursive) {
|
if (recursive) {
|
||||||
dumpPath(srcPath, sink, filter);
|
dumpPath(srcPath, sink, filter);
|
||||||
h = hashString(hashAlgo, sink.s);
|
h = hashString(hashAlgo, *sink.s);
|
||||||
} else {
|
} else {
|
||||||
auto s = readFile(srcPath);
|
auto s = readFile(srcPath);
|
||||||
dumpString(s, sink);
|
dumpString(s, sink);
|
||||||
|
@ -268,7 +270,7 @@ Path BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
||||||
info.path = makeFixedOutputPath(recursive, hashAlgo, h, name);
|
info.path = makeFixedOutputPath(recursive, hashAlgo, h, name);
|
||||||
|
|
||||||
if (repair || !isValidPath(info.path))
|
if (repair || !isValidPath(info.path))
|
||||||
addToCache(info, sink.s);
|
addToCache(info, *sink.s);
|
||||||
|
|
||||||
return info.path;
|
return info.path;
|
||||||
}
|
}
|
||||||
|
@ -283,7 +285,7 @@ Path BinaryCacheStore::addTextToStore(const string & name, const string & s,
|
||||||
if (repair || !isValidPath(info.path)) {
|
if (repair || !isValidPath(info.path)) {
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
dumpString(s, sink);
|
dumpString(s, sink);
|
||||||
addToCache(info, sink.s);
|
addToCache(info, *sink.s);
|
||||||
}
|
}
|
||||||
|
|
||||||
return info.path;
|
return info.path;
|
||||||
|
@ -313,7 +315,7 @@ void BinaryCacheStore::buildPaths(const PathSet & paths, BuildMode buildMode)
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
dumpPath(storePath, sink);
|
dumpPath(storePath, sink);
|
||||||
|
|
||||||
addToCache(info, sink.s);
|
addToCache(info, *sink.s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,8 +354,7 @@ struct BinaryCacheStoreAccessor : public FSAccessor
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
store->exportPath(storePath, false, sink);
|
store->exportPath(storePath, false, sink);
|
||||||
|
|
||||||
// FIXME: gratuitous string copying.
|
auto accessor = makeNarAccessor(sink.s);
|
||||||
auto accessor = makeNarAccessor(make_ref<std::string>(sink.s));
|
|
||||||
nars.emplace(storePath, accessor);
|
nars.emplace(storePath, accessor);
|
||||||
return {accessor, restPath};
|
return {accessor, restPath};
|
||||||
}
|
}
|
||||||
|
@ -412,12 +413,11 @@ Path BinaryCacheStore::importPath(Source & source, std::shared_ptr<FSAccessor> a
|
||||||
bool haveSignature = readInt(source) == 1;
|
bool haveSignature = readInt(source) == 1;
|
||||||
assert(!haveSignature);
|
assert(!haveSignature);
|
||||||
|
|
||||||
addToCache(info, tee.data);
|
addToCache(info, *tee.data);
|
||||||
|
|
||||||
auto accessor_ = std::dynamic_pointer_cast<BinaryCacheStoreAccessor>(accessor);
|
auto accessor_ = std::dynamic_pointer_cast<BinaryCacheStoreAccessor>(accessor);
|
||||||
if (accessor_)
|
if (accessor_)
|
||||||
// FIXME: more gratuitous string copying
|
accessor_->nars.emplace(info.path, makeNarAccessor(tee.data));
|
||||||
accessor_->nars.emplace(info.path, makeNarAccessor(make_ref<std::string>(tee.data)));
|
|
||||||
|
|
||||||
return info.path;
|
return info.path;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2009,7 +2009,7 @@ void DerivationGoal::startBuilder()
|
||||||
throw SysError(format("linking ‘%1%’ to ‘%2%’") % p % i);
|
throw SysError(format("linking ‘%1%’ to ‘%2%’") % p % i);
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
dumpPath(i, sink);
|
dumpPath(i, sink);
|
||||||
StringSource source(sink.s);
|
StringSource source(*sink.s);
|
||||||
restorePath(p, source);
|
restorePath(p, source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2666,8 +2666,8 @@ void DerivationGoal::registerOutputs()
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
dumpPath(actualPath, sink);
|
dumpPath(actualPath, sink);
|
||||||
deletePath(actualPath);
|
deletePath(actualPath);
|
||||||
sink.s = rewriteHashes(sink.s, rewritesFromTmp);
|
sink.s = make_ref<std::string>(rewriteHashes(*sink.s, rewritesFromTmp));
|
||||||
StringSource source(sink.s);
|
StringSource source(*sink.s);
|
||||||
restorePath(actualPath, source);
|
restorePath(actualPath, source);
|
||||||
|
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
|
|
|
@ -1415,9 +1415,9 @@ Path LocalStore::addToStore(const string & name, const Path & _srcPath,
|
||||||
if (recursive)
|
if (recursive)
|
||||||
dumpPath(srcPath, sink, filter);
|
dumpPath(srcPath, sink, filter);
|
||||||
else
|
else
|
||||||
sink.s = readFile(srcPath);
|
sink.s = make_ref<std::string>(readFile(srcPath));
|
||||||
|
|
||||||
return addToStoreFromDump(sink.s, name, recursive, hashAlgo, repair);
|
return addToStoreFromDump(*sink.s, name, recursive, hashAlgo, repair);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1442,14 +1442,14 @@ Path LocalStore::addTextToStore(const string & name, const string & s,
|
||||||
|
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
dumpString(s, sink);
|
dumpString(s, sink);
|
||||||
auto hash = hashString(htSHA256, sink.s);
|
auto hash = hashString(htSHA256, *sink.s);
|
||||||
|
|
||||||
optimisePath(dstPath);
|
optimisePath(dstPath);
|
||||||
|
|
||||||
ValidPathInfo info;
|
ValidPathInfo info;
|
||||||
info.path = dstPath;
|
info.path = dstPath;
|
||||||
info.narHash = hash;
|
info.narHash = hash;
|
||||||
info.narSize = sink.s.size();
|
info.narSize = sink.s->size();
|
||||||
info.references = references;
|
info.references = references;
|
||||||
registerValidPath(info);
|
registerValidPath(info);
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,11 +288,11 @@ template PathSet readStrings(Source & source);
|
||||||
void StringSink::operator () (const unsigned char * data, size_t len)
|
void StringSink::operator () (const unsigned char * data, size_t len)
|
||||||
{
|
{
|
||||||
static bool warned = false;
|
static bool warned = false;
|
||||||
if (!warned && s.size() > threshold) {
|
if (!warned && s->size() > threshold) {
|
||||||
warnLargeDump();
|
warnLargeDump();
|
||||||
warned = true;
|
warned = true;
|
||||||
}
|
}
|
||||||
s.append((const char *) data, len);
|
s->append((const char *) data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,9 @@ private:
|
||||||
/* A sink that writes data to a string. */
|
/* A sink that writes data to a string. */
|
||||||
struct StringSink : Sink
|
struct StringSink : Sink
|
||||||
{
|
{
|
||||||
string s;
|
ref<std::string> s;
|
||||||
|
StringSink() : s(make_ref<std::string>()) { };
|
||||||
|
StringSink(ref<std::string> s) : s(s) { };
|
||||||
void operator () (const unsigned char * data, size_t len) override;
|
void operator () (const unsigned char * data, size_t len) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue