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
}
|