diff options
Diffstat (limited to 'lib/gras_impl/output_buffer_queues.hpp')
-rw-r--r-- | lib/gras_impl/output_buffer_queues.hpp | 84 |
1 files changed, 47 insertions, 37 deletions
diff --git a/lib/gras_impl/output_buffer_queues.hpp b/lib/gras_impl/output_buffer_queues.hpp index 722a4c2..3618b1b 100644 --- a/lib/gras_impl/output_buffer_queues.hpp +++ b/lib/gras_impl/output_buffer_queues.hpp @@ -3,83 +3,76 @@ #ifndef INCLUDED_LIBGRAS_IMPL_OUTPUT_BUFFER_QUEUES_HPP #define INCLUDED_LIBGRAS_IMPL_OUTPUT_BUFFER_QUEUES_HPP +#include <gras/buffer_queue.hpp> #include <gras_impl/bitset.hpp> #include <vector> -#include <boost/circular_buffer.hpp> namespace gras { -template <typename T> struct OutputBufferQueues { - enum {MAX_QUEUE_SIZE = 128}; - BitSet _bitset; - std::vector<boost::circular_buffer<T> > _queues; - - GRAS_FORCE_INLINE void resize(const size_t size) + void set_buffer_queue(const size_t i, BufferQueueSptr queue) { - _bitset.resize(size); - _queues.resize(size, boost::circular_buffer<T>(MAX_QUEUE_SIZE)); + _queues[i] = queue; + _update(i); } - GRAS_FORCE_INLINE void push(const size_t i, const T &value) + void set_reserve_bytes(const size_t i, const size_t num_bytes) { - _queues[i].push_back(value); - _bitset.set(i); + _reserve_bytes[i] = num_bytes; + if (_queues[i]) _update(i); } - //! used for input buffer inlining - GRAS_FORCE_INLINE void push_front(const size_t i, const T &value) + GRAS_FORCE_INLINE void resize(const size_t size) { - ASSERT(not _queues[i].full()); - _queues[i].push_front(value); - _bitset.set(i); + _bitset.resize(size); + _queues.resize(size); + _reserve_bytes.resize(size, 1); } - GRAS_FORCE_INLINE const T &front(const size_t i) const + GRAS_FORCE_INLINE void push(const size_t i, const SBuffer &buff) { - return _queues[i].front(); + if (not _queues[i]) return; //block is likely done, throw out buffer + _queues[i]->push(buff); + _update(i); } - GRAS_FORCE_INLINE T &front(const size_t i) + GRAS_FORCE_INLINE void flush_all(void) { - ASSERT(not _queues[i].empty()); - return _queues[i].front(); + const size_t old_size = this->size(); + this->resize(0); + this->resize(old_size); } - GRAS_FORCE_INLINE void pop(const size_t i) + GRAS_FORCE_INLINE SBuffer &front(const size_t i) { - _queues[i].front() = T(); - _queues[i].pop_front(); - _bitset.set(i, not _queues[i].empty()); + ASSERT(not this->empty(i)); + return _queues[i]->front(); } - GRAS_FORCE_INLINE void fail(const size_t i) + GRAS_FORCE_INLINE void pop(const size_t i) { - _bitset.reset(i); + ASSERT(_queues[i]); + ASSERT(not _queues[i]->empty()); + _queues[i]->pop(); + _update(i); } - GRAS_FORCE_INLINE void flush(const size_t i) + GRAS_FORCE_INLINE void fail(const size_t i) { - _queues[i].clear(); _bitset.reset(i); } - GRAS_FORCE_INLINE void flush_all(void) - { - for (size_t i = 0; i < this->size(); i++) this->flush(i); - } - GRAS_FORCE_INLINE bool ready(const size_t i) const { - return not _queues[i].empty(); + return _bitset[i]; } GRAS_FORCE_INLINE bool empty(const size_t i) const { - return _queues[i].empty(); + return (not _queues[i] or _queues[i]->empty()); } GRAS_FORCE_INLINE bool all_ready(void) const @@ -91,6 +84,23 @@ struct OutputBufferQueues { return _queues.size(); } + + GRAS_FORCE_INLINE void _update(const size_t i) + { + if (not _queues[i] or _queues[i]->empty()) + { + _bitset.reset(i); + return; + } + const SBuffer &front = _queues[i]->front(); + const size_t avail = front.get_actual_length() - front.offset - front.length; + _bitset.set(i, avail >= _reserve_bytes[i]); + } + + BitSet _bitset; + std::vector<BufferQueueSptr> _queues; + std::vector<size_t> _reserve_bytes; + }; } //namespace gras |