RingBuffer.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /*
  2. * Copyright (c) 2021, Sahan Fernando <sahan.h.fernando@gmail.com>.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/String.h>
  8. #include <Kernel/PhysicalAddress.h>
  9. #include <Kernel/UserOrKernelBuffer.h>
  10. namespace Kernel::Memory {
  11. class RingBuffer {
  12. public:
  13. RingBuffer(String region_name, size_t capacity);
  14. bool has_space() const { return m_num_used_bytes < m_capacity_in_bytes; }
  15. bool copy_data_in(const UserOrKernelBuffer& buffer, size_t offset, size_t length, PhysicalAddress& start_of_copied_data, size_t& bytes_copied);
  16. KResultOr<size_t> copy_data_out(size_t size, UserOrKernelBuffer& buffer) const;
  17. KResultOr<PhysicalAddress> reserve_space(size_t size);
  18. void reclaim_space(PhysicalAddress chunk_start, size_t chunk_size);
  19. PhysicalAddress start_of_used() const;
  20. Spinlock<u8>& lock() { return m_lock; }
  21. size_t used_bytes() const { return m_num_used_bytes; }
  22. PhysicalAddress start_of_region() const { return m_region->physical_page(0)->paddr(); }
  23. VirtualAddress vaddr() const { return m_region->vaddr(); }
  24. size_t bytes_till_end() const { return (m_capacity_in_bytes - ((m_start_of_used + m_num_used_bytes) % m_capacity_in_bytes)) % m_capacity_in_bytes; };
  25. private:
  26. OwnPtr<Memory::Region> m_region;
  27. Spinlock<u8> m_lock;
  28. size_t m_start_of_used {};
  29. size_t m_num_used_bytes {};
  30. size_t m_capacity_in_bytes {};
  31. };
  32. }