MPD  0.20.6
Public Member Functions | Protected Member Functions | Protected Attributes
AsyncInputStream Class Referenceabstract

Helper class for moving asynchronous (non-blocking) InputStream implementations to the I/O thread. More...

#include <AsyncInputStream.hxx>

Inheritance diagram for AsyncInputStream:
[legend]
Collaboration diagram for AsyncInputStream:
[legend]

Public Member Functions

 AsyncInputStream (const char *_url, Mutex &_mutex, Cond &_cond, size_t _buffer_size, size_t _resume_at)
 
virtual ~AsyncInputStream ()
 
void Check () final
 Check for errors that may have occurred in the I/O thread. More...
 
bool IsEOF () final
 Returns true if the stream has reached end-of-file. More...
 
void Seek (offset_type new_offset) final
 Seeks to the specified position in the stream. More...
 
TagReadTag () final
 Reads the tag from the stream. More...
 
bool IsAvailable () final
 Returns true if the next read operation will not block: either data is available, or end-of-stream has been reached, or an error has occurred. More...
 
size_t Read (void *ptr, size_t read_size) final
 Reads data from the stream into the caller-supplied buffer. More...
 
- Public Member Functions inherited from InputStream
 InputStream (const char *_uri, Mutex &_mutex, Cond &_cond)
 
virtual ~InputStream ()
 Close the input stream and free resources. More...
 
const char * GetURI () const
 The absolute URI which was used to open this stream. More...
 
void Lock ()
 
void Unlock ()
 
virtual void Update ()
 Update the public attributes. More...
 
void SetReady ()
 
bool IsReady () const
 Return whether the stream is ready for reading and whether the other attributes in this struct are valid. More...
 
void WaitReady ()
 
void LockWaitReady ()
 Wrapper for WaitReady() which locks and unlocks the mutex; the caller must not be holding it already. More...
 
gcc_pure bool HasMimeType () const
 
gcc_pure const char * GetMimeType () const
 
void ClearMimeType ()
 
gcc_nonnull_all void SetMimeType (const char *_mime)
 
void SetMimeType (std::string &&_mime)
 
gcc_pure bool KnownSize () const
 
gcc_pure offset_type GetSize () const
 
void AddOffset (offset_type delta)
 
gcc_pure offset_type GetOffset () const
 
gcc_pure offset_type GetRest () const
 
gcc_pure bool IsSeekable () const
 
gcc_pure bool CheapSeeking () const
 Determines whether seeking is cheap. More...
 
void LockSeek (offset_type offset)
 Wrapper for Seek() which locks and unlocks the mutex; the caller must not be holding it already. More...
 
void Rewind ()
 Rewind to the beginning of the stream. More...
 
void LockRewind ()
 
void Skip (offset_type _offset)
 Skip input bytes. More...
 
void LockSkip (offset_type _offset)
 
gcc_pure bool LockIsEOF ()
 Wrapper for IsEOF() which locks and unlocks the mutex; the caller must not be holding it already. More...
 
gcc_malloc TagLockReadTag ()
 Wrapper for ReadTag() which locks and unlocks the mutex; the caller must not be holding it already. More...
 
gcc_nonnull_all size_t LockRead (void *ptr, size_t size)
 Wrapper for Read() which locks and unlocks the mutex; the caller must not be holding it already. More...
 
gcc_nonnull_all void ReadFull (void *ptr, size_t size)
 Reads the whole data from the stream into the caller-supplied buffer. More...
 
gcc_nonnull_all void LockReadFull (void *ptr, size_t size)
 Wrapper for ReadFull() which locks and unlocks the mutex; the caller must not be holding it already. More...
 

Protected Member Functions

void SetTag (Tag *_tag)
 Pass an tag from the I/O thread to the client thread. More...
 
void ClearTag ()
 
void Pause ()
 
bool IsPaused () const
 
void SetClosed ()
 Declare that the underlying stream was closed. More...
 
bool IsBufferEmpty () const
 
bool IsBufferFull () const
 
gcc_pure size_t GetBufferSpace () const
 Determine how many bytes can be added to the buffer. More...
 
CircularBuffer< uint8_t >::Range PrepareWriteBuffer ()
 
void CommitWriteBuffer (size_t nbytes)
 
void AppendToBuffer (const void *data, size_t append_size)
 Append data to the buffer. More...
 
virtual void DoResume ()=0
 Implement code here that will resume the stream after it has been paused due to full input buffer. More...
 
virtual void DoSeek (offset_type new_offset)=0
 The actual Seek() implementation. More...
 
bool IsSeekPending () const
 
void SeekDone ()
 Call this after seeking has finished. More...
 

Protected Attributes

std::exception_ptr postponed_exception
 
- Protected Attributes inherited from InputStream
bool ready
 indicates whether the stream is ready for reading and whether the other attributes in this struct are valid More...
 
bool seekable
 if true, then the stream is fully seekable More...
 
offset_type size
 the size of the resource, or UNKNOWN_SIZE if unknown More...
 
offset_type offset
 the current offset within the stream More...
 

Additional Inherited Members

- Public Types inherited from InputStream
typedef ::offset_type offset_type
 
- Static Public Member Functions inherited from InputStream
static gcc_nonnull_all InputStreamPtr Open (const char *uri, Mutex &mutex, Cond &cond)
 Opens a new input stream. More...
 
static gcc_nonnull_all InputStreamPtr OpenReady (const char *uri, Mutex &mutex, Cond &cond)
 Just like Open(), but waits for the stream to become ready. More...
 
- Data Fields inherited from InputStream
Mutexmutex
 A mutex that protects the mutable attributes of this object and its implementation. More...
 
Condcond
 A cond that gets signalled when the state of this object changes from the I/O thread. More...
 
- Static Protected Attributes inherited from InputStream
static constexpr offset_type UNKNOWN_SIZE = -1
 

Detailed Description

Helper class for moving asynchronous (non-blocking) InputStream implementations to the I/O thread.

Data is being read into a ring buffer, and that buffer is then consumed by another thread using the regular InputStream API.

Definition at line 36 of file AsyncInputStream.hxx.

Constructor & Destructor Documentation

AsyncInputStream::AsyncInputStream ( const char *  _url,
Mutex _mutex,
Cond _cond,
size_t  _buffer_size,
size_t  _resume_at 
)
Parameters
_buffera buffer allocated with HugeAllocate(); the destructor will free it using HugeFree()
virtual AsyncInputStream::~AsyncInputStream ( )
virtual

Member Function Documentation

void AsyncInputStream::AppendToBuffer ( const void *  data,
size_t  append_size 
)
protected

Append data to the buffer.

The size must fit into the buffer; see GetBufferSpace().

void AsyncInputStream::Check ( )
finalvirtual

Check for errors that may have occurred in the I/O thread.

Throws std::runtime_error on error.

Reimplemented from InputStream.

void AsyncInputStream::ClearTag ( )
inlineprotected

Definition at line 97 of file AsyncInputStream.hxx.

void AsyncInputStream::CommitWriteBuffer ( size_t  nbytes)
protected
virtual void AsyncInputStream::DoResume ( )
protectedpure virtual

Implement code here that will resume the stream after it has been paused due to full input buffer.

virtual void AsyncInputStream::DoSeek ( offset_type  new_offset)
protectedpure virtual

The actual Seek() implementation.

This virtual method will be called from within the I/O thread. When the operation is finished, call SeekDone() to notify the caller.

gcc_pure size_t AsyncInputStream::GetBufferSpace ( ) const
inlineprotected

Determine how many bytes can be added to the buffer.

Definition at line 128 of file AsyncInputStream.hxx.

bool AsyncInputStream::IsAvailable ( )
finalvirtual

Returns true if the next read operation will not block: either data is available, or end-of-stream has been reached, or an error has occurred.

The caller must lock the mutex.

Reimplemented from InputStream.

bool AsyncInputStream::IsBufferEmpty ( ) const
inlineprotected

Definition at line 116 of file AsyncInputStream.hxx.

bool AsyncInputStream::IsBufferFull ( ) const
inlineprotected

Definition at line 120 of file AsyncInputStream.hxx.

bool AsyncInputStream::IsEOF ( )
finalvirtual

Returns true if the stream has reached end-of-file.

The caller must lock the mutex.

Implements InputStream.

bool AsyncInputStream::IsPaused ( ) const
inlineprotected

Definition at line 103 of file AsyncInputStream.hxx.

bool AsyncInputStream::IsSeekPending ( ) const
inlineprotected

Definition at line 157 of file AsyncInputStream.hxx.

void AsyncInputStream::Pause ( )
protected
CircularBuffer<uint8_t>::Range AsyncInputStream::PrepareWriteBuffer ( )
inlineprotected

Definition at line 132 of file AsyncInputStream.hxx.

size_t AsyncInputStream::Read ( void *  ptr,
size_t  size 
)
finalvirtual

Reads data from the stream into the caller-supplied buffer.

Returns 0 on error or eof (check with IsEOF()).

The caller must lock the mutex.

Throws std::runtime_error on error.

Parameters
ptrthe buffer to read into
sizethe maximum number of bytes to read
Returns
the number of bytes read

Implements InputStream.

Tag* AsyncInputStream::ReadTag ( )
finalvirtual

Reads the tag from the stream.

The caller must lock the mutex.

Returns
a tag object which must be freed by the caller, or nullptr if the tag has not changed since the last call

Reimplemented from InputStream.

void AsyncInputStream::Seek ( offset_type  offset)
finalvirtual

Seeks to the specified position in the stream.

This will most likely fail if the "seekable" flag is false.

The caller must lock the mutex.

Throws std::runtime_error on error.

Parameters
offsetthe relative offset

Reimplemented from InputStream.

void AsyncInputStream::SeekDone ( )
protected

Call this after seeking has finished.

It will notify the client thread.

void AsyncInputStream::SetClosed ( )
inlineprotected

Declare that the underlying stream was closed.

We will continue feeding Read() calls from the buffer until it runs empty.

Definition at line 112 of file AsyncInputStream.hxx.

void AsyncInputStream::SetTag ( Tag _tag)
protected

Pass an tag from the I/O thread to the client thread.

Field Documentation

std::exception_ptr AsyncInputStream::postponed_exception
protected

Definition at line 69 of file AsyncInputStream.hxx.


The documentation for this class was generated from the following file: