#pragma once #include #include #include class DoubleBuffer { public: DoubleBuffer() : m_write_buffer(&m_buffer1) , m_read_buffer(&m_buffer2) , m_lock("DoubleBuffer") { } ssize_t write(const byte*, size_t); ssize_t read(byte*, size_t); bool is_empty() const { return m_empty; } // FIXME: Isn't this racy? What if we get interrupted between getting the buffer pointer and dereferencing it? size_t bytes_in_write_buffer() const { return m_write_buffer->size(); } private: void flip(); void compute_emptiness(); Vector* m_write_buffer { nullptr }; Vector* m_read_buffer { nullptr }; Vector m_buffer1; Vector m_buffer2; size_t m_read_buffer_index { 0 }; bool m_empty { true }; Lock m_lock; };