input/Stream: remove attribute "cond", replace with handler interface

This adds a bit of overhead, but also adds flexibility to the API,
because arbitrary triggers may be invoked from that virtual method
implementation, not just Cond::signal().

The motivation for this is to make the handlers more dynamic, for the
upcoming buffering class utilizing ProxyInputStream.
This commit is contained in:
Max Kellermann
2018-06-22 19:37:18 +02:00
parent 01d8eb6290
commit d0fbf6db59
66 changed files with 403 additions and 280 deletions

View File

@@ -19,8 +19,8 @@
#include "config.h"
#include "InputStream.hxx"
#include "Handler.hxx"
#include "tag/Tag.hxx"
#include "thread/Cond.hxx"
#include "util/StringCompare.hxx"
#include <stdexcept>
@@ -47,26 +47,8 @@ InputStream::SetReady() noexcept
assert(!ready);
ready = true;
cond.broadcast();
}
void
InputStream::WaitReady() noexcept
{
while (true) {
Update();
if (ready)
break;
cond.wait(mutex);
}
}
void
InputStream::LockWaitReady() noexcept
{
const std::lock_guard<Mutex> protect(mutex);
WaitReady();
InvokeOnReady();
}
/**
@@ -177,3 +159,17 @@ InputStream::LockIsEOF() noexcept
const std::lock_guard<Mutex> protect(mutex);
return IsEOF();
}
void
InputStream::InvokeOnReady() noexcept
{
if (handler != nullptr)
handler->OnInputStreamReady();
}
void
InputStream::InvokeOnAvailable() noexcept
{
if (handler != nullptr)
handler->OnInputStreamAvailable();
}