Merge branch 'v0.20.x'

This commit is contained in:
Max Kellermann
2018-03-15 20:07:11 +01:00
9 changed files with 50 additions and 14 deletions

View File

@@ -37,8 +37,12 @@ ThreadInputStream::ThreadInputStream(const char *_plugin,
allocation.ForkCow(false);
}
ThreadInputStream::~ThreadInputStream() noexcept
void
ThreadInputStream::Stop() noexcept
{
if (!thread.IsDefined())
return;
{
const std::lock_guard<Mutex> lock(mutex);
close = true;
@@ -69,7 +73,7 @@ ThreadInputStream::ThreadFunc() noexcept
Open();
} catch (...) {
postponed_exception = std::current_exception();
cond.broadcast();
SetReady();
return;
}

View File

@@ -29,6 +29,7 @@
#include <exception>
#include <assert.h>
#include <stdint.h>
/**
@@ -39,6 +40,11 @@
* manages the thread and the buffer.
*
* This works only for "streams": unknown length, no seeking, no tags.
*
* The implementation must call Stop() before its destruction
* completes. This cannot be done in ~ThreadInputStream() because at
* this point, the class has been morphed back to #ThreadInputStream
* and the still-running thread will crash due to pure method call.
*/
class ThreadInputStream : public InputStream {
const char *const plugin;
@@ -73,7 +79,12 @@ public:
const char *_uri, Mutex &_mutex, Cond &_cond,
size_t _buffer_size) noexcept;
virtual ~ThreadInputStream() noexcept;
#ifndef NDEBUG
~ThreadInputStream() override {
/* Stop() must have been called already */
assert(!thread.IsDefined());
}
#endif
/**
* Initialize the object and start the thread.
@@ -87,6 +98,12 @@ public:
size_t Read(void *ptr, size_t size) override final;
protected:
/**
* Stop the thread and free the buffer. This must be called
* before destruction of this object completes.
*/
void Stop() noexcept;
void SetMimeType(const char *_mime) noexcept {
assert(thread.IsInside());

View File

@@ -39,6 +39,10 @@ public:
MMS_BUFFER_SIZE) {
}
~MmsInputStream() noexcept override {
Stop();
}
protected:
virtual void Open() override;
virtual size_t ThreadRead(void *ptr, size_t size) override;