1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "serialise-async.hh"

namespace nix {
#if !defined(HAVE_THREADBARE_LIBC)
size_t detail::BufferedAsyncSource::read(char * data, size_t len)
{
    auto & buf = from.getBuffer();
    if (auto avail = buf.getReadBuffer(); !avail.empty()) {
        len = std::min(len, avail.size());
        memcpy(data, avail.data(), len);
        buf.consumed(len);
        return len;
    } else if (auto got = from.read(data, len).wait(ws).value(); got) {
        return *got;
    } else {
        throw EndOfFile("async stream ended");
    }
}
#else
size_t detail::IndirectSource::read(char * data, size_t len)
{
    if (auto avail = from.getBuffer().getReadBuffer(); !avail.empty()) {
        len = std::min(len, avail.size());
        memcpy(data, avail.data(), len);
        from.getBuffer().consumed(len);
        return len;
    }

    auto got = executor.executeSync([&] { return from.read(data, len); }).value();
    if (!got) {
        throw EndOfFile("indirect source ended");
    }
    return *got;
}

ThreadPool detail::deserPool{"deser pool"};
#endif
}