aboutsummaryrefslogtreecommitdiff
path: root/src/libutil/serialise.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil/serialise.cc')
-rw-r--r--src/libutil/serialise.cc26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc
index 31df6fdfd..0e75eeec2 100644
--- a/src/libutil/serialise.cc
+++ b/src/libutil/serialise.cc
@@ -169,17 +169,13 @@ std::unique_ptr<Source> sinkToSource(
{
typedef boost::coroutines2::coroutine<std::string> coro_t;
+ std::function<void(Sink &)> fun;
std::function<void()> eof;
- coro_t::pull_type coro;
+ std::experimental::optional<coro_t::pull_type> coro;
+ bool started = false;
SinkToSource(std::function<void(Sink &)> fun, std::function<void()> eof)
- : eof(eof)
- , coro([&](coro_t::push_type & yield) {
- LambdaSink sink([&](const unsigned char * data, size_t len) {
- if (len) yield(std::string((const char *) data, len));
- });
- fun(sink);
- })
+ : fun(fun), eof(eof)
{
}
@@ -188,11 +184,19 @@ std::unique_ptr<Source> sinkToSource(
size_t read(unsigned char * data, size_t len) override
{
- if (!coro) { eof(); abort(); }
+ if (!coro)
+ coro = coro_t::pull_type([&](coro_t::push_type & yield) {
+ LambdaSink sink([&](const unsigned char * data, size_t len) {
+ if (len) yield(std::string((const char *) data, len));
+ });
+ fun(sink);
+ });
+
+ if (!*coro) { eof(); abort(); }
if (pos == cur.size()) {
- if (!cur.empty()) coro();
- cur = coro.get();
+ if (!cur.empty()) (*coro)();
+ cur = coro->get();
pos = 0;
}