mirror of
https://github.com/NixOS/nix.git
synced 2025-01-19 11:12:24 +00:00
Move arrays to heap, to reduce stack usage
I keep hitting stack issues on Windows. Let's just start by reducing the stack by quite a bit.
This commit is contained in:
parent
2cb0ddfe4e
commit
4fb4afa5b0
@ -142,14 +142,14 @@ static void parseContents(CreateRegularFileSink & sink, Source & source)
|
||||
sink.preallocateContents(size);
|
||||
|
||||
uint64_t left = size;
|
||||
std::array<char, 65536> buf;
|
||||
auto buf = std::make_unique<std::array<char, 65536>>();
|
||||
|
||||
while (left) {
|
||||
checkInterrupt();
|
||||
auto n = buf.size();
|
||||
auto n = buf->size();
|
||||
if ((uint64_t)n > left) n = left;
|
||||
source(buf.data(), n);
|
||||
sink({buf.data(), n});
|
||||
source(buf->data(), n);
|
||||
sink({buf->data(), n});
|
||||
left -= n;
|
||||
}
|
||||
|
||||
|
@ -299,13 +299,13 @@ void writeFile(const Path & path, Source & source, mode_t mode, bool sync)
|
||||
if (!fd)
|
||||
throw SysError("opening file '%1%'", path);
|
||||
|
||||
std::array<char, 64 * 1024> buf;
|
||||
auto buf = std::make_unique<std::array<char, 64 * 1024>>();
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
try {
|
||||
auto n = source.read(buf.data(), buf.size());
|
||||
writeFull(fd.get(), {buf.data(), n});
|
||||
auto n = source.read(buf->data(), buf->size());
|
||||
writeFull(fd.get(), {buf->data(), n});
|
||||
} catch (EndOfFile &) { break; }
|
||||
}
|
||||
} catch (Error & e) {
|
||||
|
@ -64,10 +64,10 @@ void PosixSourceAccessor::readFile(
|
||||
|
||||
off_t left = st.st_size;
|
||||
|
||||
std::array<unsigned char, 64 * 1024> buf;
|
||||
auto buf = std::make_unique<std::array<unsigned char, 64 * 1024>>();
|
||||
while (left) {
|
||||
checkInterrupt();
|
||||
ssize_t rd = read(fromDescriptorReadOnly(fd.get()), buf.data(), (size_t) std::min(left, (off_t) buf.size()));
|
||||
ssize_t rd = read(fromDescriptorReadOnly(fd.get()), buf->data(), (size_t) std::min(left, (off_t) buf->size()));
|
||||
if (rd == -1) {
|
||||
if (errno != EINTR)
|
||||
throw SysError("reading from file '%s'", showPath(path));
|
||||
@ -76,7 +76,7 @@ void PosixSourceAccessor::readFile(
|
||||
throw SysError("unexpected end-of-file reading '%s'", showPath(path));
|
||||
else {
|
||||
assert(rd <= left);
|
||||
sink({(char *) buf.data(), (size_t) rd});
|
||||
sink({(char *) buf->data(), (size_t) rd});
|
||||
left -= rd;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user