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

@@ -20,15 +20,16 @@
#include "config.h"
#include "ProxyInputStream.hxx"
#include "tag/Tag.hxx"
#include "thread/Cond.hxx"
#include <stdexcept>
ProxyInputStream::ProxyInputStream(InputStreamPtr _input) noexcept
:InputStream(_input->GetURI(), _input->mutex, _input->cond),
:InputStream(_input->GetURI(), _input->mutex),
input(std::move(_input))
{
assert(input);
input->SetHandler(this);
}
ProxyInputStream::~ProxyInputStream() noexcept = default;
@@ -40,10 +41,13 @@ ProxyInputStream::SetInput(InputStreamPtr _input) noexcept
assert(_input);
input = std::move(_input);
input->SetHandler(this);
/* this call wakes up client threads if the new input is
ready */
CopyAttributes();
set_input_cond.signal();
}
void
@@ -89,7 +93,7 @@ void
ProxyInputStream::Seek(offset_type new_offset)
{
while (!input)
cond.wait(mutex);
set_input_cond.wait(mutex);
input->Seek(new_offset);
CopyAttributes();
@@ -120,7 +124,7 @@ size_t
ProxyInputStream::Read(void *ptr, size_t read_size)
{
while (!input)
cond.wait(mutex);
set_input_cond.wait(mutex);
size_t nbytes = input->Read(ptr, read_size);
CopyAttributes();