DoubleBuffer.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include <Kernel/DoubleBuffer.h>
  2. inline void DoubleBuffer::compute_emptiness()
  3. {
  4. m_empty = m_read_buffer_index >= m_read_buffer->size() && m_write_buffer->is_empty();
  5. }
  6. void DoubleBuffer::flip()
  7. {
  8. ASSERT(m_read_buffer_index == m_read_buffer->size());
  9. swap(m_read_buffer, m_write_buffer);
  10. if (m_write_buffer->capacity() < 32)
  11. m_write_buffer->clear_with_capacity();
  12. else
  13. m_write_buffer->clear();
  14. m_read_buffer_index = 0;
  15. compute_emptiness();
  16. }
  17. ssize_t DoubleBuffer::write(const u8* data, ssize_t size)
  18. {
  19. if (!size)
  20. return 0;
  21. LOCKER(m_lock);
  22. m_write_buffer->append(data, size);
  23. compute_emptiness();
  24. return size;
  25. }
  26. ssize_t DoubleBuffer::read(u8* data, ssize_t size)
  27. {
  28. if (!size)
  29. return 0;
  30. LOCKER(m_lock);
  31. if (m_read_buffer_index >= m_read_buffer->size() && !m_write_buffer->is_empty())
  32. flip();
  33. if (m_read_buffer_index >= m_read_buffer->size())
  34. return 0;
  35. ssize_t nread = min((ssize_t)m_read_buffer->size() - m_read_buffer_index, size);
  36. memcpy(data, m_read_buffer->data() + m_read_buffer_index, nread);
  37. m_read_buffer_index += nread;
  38. compute_emptiness();
  39. return nread;
  40. }