|
HARDT - The Ham Radio DSP Toolkit
|
1 #ifndef __HBUFFEREDWRITER_H
2 #define __HBUFFEREDWRITER_H
6 #include <condition_variable>
9 #include "hwriterconsumer.h"
11 #define DEFAULT_BLOCKS_RESERVED 1000
24 std::vector<T*> _buffer;
32 std::mutex _drainMutex;
33 std::condition_variable _drainLock;
35 std::mutex _readWriteMutex;
41 _blocksize(blocksize),
42 _blocksReserved(reserved),
54 _blocksize(blocksize),
55 _blocksReserved(reserved),
69 HLog(
"Deleting remaining items from the buffer");
70 while( _buffer.size() > 0 ) {
72 _buffer.erase( _buffer.begin(), _buffer.begin() + 1 );
74 HLog(
"Reducing the size of the buffer");
75 _buffer.shrink_to_fit();
76 HLog(
"Cleanup completed, ready to delete this object");
80 int Write(T* src,
size_t blocksize);
85 HLog(
"Start() called");
87 throw new HWriterIOException(
"Drain thread is running. Writer must not be started again without being stopped first");
90 HLog(
"Starting downstream writer");
91 bool started = _writer->
Start();
93 HLog(
"Starting drain thread");
96 HLog(
"Drain thread is running");
103 HLog(
"Stop() called");
106 HLog(
"Drain thread is stopped, stopping downstream writer");
107 return _writer->
Stop();
118 return _writer->
Command(command);
130 while( _isDraining && _buffer.size() > 0 ) {
145 return _buffer.size();
157 _buffer.reserve( _blocks *
sizeof(T*) );
163 HLog(
"Starting drain thread");
165 _drain =
new std::thread( [
this]() {
166 while( _isDraining ) {
169 HLog(
"Drain thread exiting");
171 HLog(
"Drain thread is running");
177 if( _isDraining && _drain != NULL ) {
179 HLog(
"Signal halt to drain thread");
182 HLog(
"Awake a waiting drain thread");
183 _drainLock.notify_one();
185 HLog(
"Joining drain thread");
188 HLog(
"Drain thread joined");
void SetWriter(HWriter< T > *writer)
Definition: hbufferedwriter.h:122
int Write(T *src, size_t blocksize)
Definition: hbufferedwriter.cpp:11
bool Enabled()
Definition: hbufferedwriter.h:149
int Reserved()
Definition: hbufferedwriter.h:136
virtual void SetWriter(HWriter< T > *writer)=0
bool Start()
Definition: hbufferedwriter.h:83
~HBufferedWriter()
Definition: hbufferedwriter.h:65
bool Command(HCommand *command)
Definition: hbufferedwriter.h:116
virtual bool Command(HCommand *command)=0
virtual bool Start()
Definition: hwriter.h:21
bool Stop()
Definition: hbufferedwriter.h:101
Definition: hexceptions.h:109
HBufferedWriter(HWriter< T > *writer, size_t blocksize, int reserved=DEFAULT_BLOCKS_RESERVED, bool enabled=true)
Definition: hbufferedwriter.h:53
void Flush()
Definition: hbufferedwriter.h:128
Definition: hcommand.h:81
HWriter< T > * Writer()
Definition: hwriter.h:33
int Used()
Definition: hbufferedwriter.h:143
virtual bool Stop()
Definition: hwriter.h:27
HBufferedWriter(HWriterConsumer< T > *consumer, size_t blocksize, int reserved=DEFAULT_BLOCKS_RESERVED, bool enabled=true)
Definition: hbufferedwriter.h:40
Definition: hbufferedwriter.h:17
Definition: hwriterconsumer.h:8