DoubleBuffer.cpp 896 B

12345678910111213141516171819202122232425262728293031
  1. #include "DoubleBuffer.h"
  2. void DoubleBuffer::flip()
  3. {
  4. InterruptDisabler disabler;
  5. ASSERT(m_read_buffer_index == m_read_buffer->size());
  6. swap(m_read_buffer, m_write_buffer);
  7. if (m_write_buffer->capacity() < 32)
  8. m_write_buffer->clear_with_capacity();
  9. else
  10. m_write_buffer->clear();
  11. m_read_buffer_index = 0;
  12. }
  13. ssize_t DoubleBuffer::write(const byte* data, size_t size)
  14. {
  15. m_write_buffer->append(data, size);
  16. return size;
  17. }
  18. ssize_t DoubleBuffer::read(byte* data, size_t size)
  19. {
  20. if (m_read_buffer_index >= m_read_buffer->size() && !m_write_buffer->is_empty())
  21. flip();
  22. if (m_read_buffer_index >= m_read_buffer->size())
  23. return 0;
  24. ssize_t nread = min(m_read_buffer->size() - m_read_buffer_index, size);
  25. memcpy(data, m_read_buffer->data() + m_read_buffer_index, nread);
  26. m_read_buffer_index += nread;
  27. return nread;
  28. }