FIFO.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "FIFO.h"
  2. #include <AK/StdLibExtras.h>
  3. //#define FIFO_DEBUG
  4. RetainPtr<FIFO> FIFO::create()
  5. {
  6. return adopt(*new FIFO);
  7. }
  8. FIFO::FIFO()
  9. {
  10. }
  11. void FIFO::open(Direction direction)
  12. {
  13. if (direction == Reader) {
  14. ++m_readers;
  15. #ifdef FIFO_DEBUG
  16. kprintf("open reader (%u)\n", m_readers);
  17. #endif
  18. } else if (direction == Writer) {
  19. ++m_writers;
  20. #ifdef FIFO_DEBUG
  21. kprintf("open writer (%u)\n", m_writers);
  22. #endif
  23. }
  24. }
  25. void FIFO::close(Direction direction)
  26. {
  27. if (direction == Reader) {
  28. #ifdef FIFO_DEBUG
  29. kprintf("close reader (%u - 1)\n", m_readers);
  30. #endif
  31. ASSERT(m_readers);
  32. --m_readers;
  33. } else if (direction == Writer) {
  34. #ifdef FIFO_DEBUG
  35. kprintf("close writer (%u - 1)\n", m_writers);
  36. #endif
  37. ASSERT(m_writers);
  38. --m_writers;
  39. }
  40. }
  41. bool FIFO::can_read() const
  42. {
  43. return !m_buffer.is_empty() || !m_writers;
  44. }
  45. bool FIFO::can_write() const
  46. {
  47. return m_buffer.bytes_in_write_buffer() < 4096;
  48. }
  49. ssize_t FIFO::read(byte* buffer, size_t size)
  50. {
  51. if (!m_writers && m_buffer.is_empty())
  52. return 0;
  53. #ifdef FIFO_DEBUG
  54. dbgprintf("fifo: read(%u)\n",size);
  55. #endif
  56. size_t nread = m_buffer.read(buffer, size);
  57. #ifdef FIFO_DEBUG
  58. dbgprintf(" -> read (%c) %u\n", buffer[0], nread);
  59. #endif
  60. return nread;
  61. }
  62. ssize_t FIFO::write(const byte* buffer, size_t size)
  63. {
  64. if (!m_readers)
  65. return 0;
  66. #ifdef FIFO_DEBUG
  67. dbgprintf("fifo: write(%p, %u)\n", buffer, size);
  68. #endif
  69. return m_buffer.write(buffer, size);
  70. }