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

@@ -22,6 +22,8 @@
#include "InputStream.hxx"
#include "Ptr.hxx"
#include "Handler.hxx"
#include "thread/Cond.hxx"
struct Tag;
@@ -33,7 +35,9 @@ struct Tag;
* The inner #InputStream instance may be nullptr initially, to be set
* later.
*/
class ProxyInputStream : public InputStream {
class ProxyInputStream : public InputStream, protected InputStreamHandler {
Cond set_input_cond;
protected:
InputStreamPtr input;
@@ -45,8 +49,8 @@ public:
* Once that instance becomes available, call SetInput().
*/
ProxyInputStream(const char *_uri,
Mutex &_mutex, Cond &_cond) noexcept
:InputStream(_uri, _mutex, _cond) {}
Mutex &_mutex) noexcept
:InputStream(_uri, _mutex) {}
virtual ~ProxyInputStream() noexcept;
@@ -78,6 +82,15 @@ protected:
* attributes.
*/
void CopyAttributes();
/* virtual methods from class InputStreamHandler */
void OnInputStreamReady() noexcept override {
InvokeOnReady();
}
void OnInputStreamAvailable() noexcept override {
InvokeOnAvailable();
}
};
#endif