summaryrefslogtreecommitdiff
path: root/lib/gras_impl/output_buffer_queues.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gras_impl/output_buffer_queues.hpp')
-rw-r--r--lib/gras_impl/output_buffer_queues.hpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/gras_impl/output_buffer_queues.hpp b/lib/gras_impl/output_buffer_queues.hpp
index deea0e1..f0859a3 100644
--- a/lib/gras_impl/output_buffer_queues.hpp
+++ b/lib/gras_impl/output_buffer_queues.hpp
@@ -31,6 +31,7 @@ struct OutputBufferQueues
_bitset.resize(size);
_queues.resize(size);
_reserve_bytes.resize(size, 1);
+ _inline_buffer.resize(size);
}
GRAS_FORCE_INLINE void push(const size_t i, const SBuffer &buff)
@@ -49,12 +50,38 @@ struct OutputBufferQueues
GRAS_FORCE_INLINE SBuffer &front(const size_t i)
{
+ if GRAS_UNLIKELY(_inline_buffer[i]) return _inline_buffer[i];
ASSERT(not this->empty(i));
return _queues[i]->front();
}
+ GRAS_FORCE_INLINE void consume(const size_t i)
+ {
+ if GRAS_UNLIKELY(_inline_buffer[i])
+ {
+ _inline_buffer[i].reset();
+ return;
+ }
+
+ ASSERT(not this->empty(i));
+ SBuffer &buff = this->front(i);
+ if GRAS_UNLIKELY(buff.length == 0) return;
+
+ //increment buffer for next use
+ buff.offset += buff.length;
+ buff.length = 0;
+
+ this->pop(i);
+ }
+
GRAS_FORCE_INLINE void pop(const size_t i)
{
+ if GRAS_UNLIKELY(_inline_buffer[i])
+ {
+ _inline_buffer[i].reset();
+ return;
+ }
+
ASSERT(_queues[i]);
ASSERT(not _queues[i]->empty());
_queues[i]->pop();
@@ -73,6 +100,7 @@ struct OutputBufferQueues
GRAS_FORCE_INLINE bool empty(const size_t i) const
{
+ if GRAS_UNLIKELY(_inline_buffer[i]) return false;
return (not _queues[i] or _queues[i]->empty());
}
@@ -98,9 +126,17 @@ struct OutputBufferQueues
_bitset.set(i, avail >= _reserve_bytes[i]);
}
+ GRAS_FORCE_INLINE void set_inline(const size_t i, const SBuffer &inline_buffer)
+ {
+ _inline_buffer[i] = inline_buffer;
+ _inline_buffer[i].length = 0;
+ _bitset.set(i);
+ }
+
BitSet _bitset;
std::vector<BufferQueueSptr> _queues;
std::vector<size_t> _reserve_bytes;
+ std::vector<SBuffer> _inline_buffer;
};