FIFO.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/DoubleBuffer.h>
  8. #include <Kernel/FileSystem/File.h>
  9. #include <Kernel/Locking/Mutex.h>
  10. #include <Kernel/UnixTypes.h>
  11. #include <Kernel/WaitQueue.h>
  12. namespace Kernel {
  13. class OpenFileDescription;
  14. class FIFO final : public File {
  15. public:
  16. enum class Direction : u8 {
  17. Neither,
  18. Reader,
  19. Writer
  20. };
  21. static ErrorOr<NonnullLockRefPtr<FIFO>> try_create(UserID);
  22. virtual ~FIFO() override;
  23. UserID uid() const { return m_uid; }
  24. ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_direction(Direction);
  25. ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_direction_blocking(Direction);
  26. #pragma GCC diagnostic push
  27. #pragma GCC diagnostic ignored "-Woverloaded-virtual"
  28. void attach(Direction);
  29. void detach(Direction);
  30. #pragma GCC diagnostic pop
  31. private:
  32. // ^File
  33. virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
  34. virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
  35. virtual ErrorOr<struct stat> stat() const override;
  36. virtual bool can_read(OpenFileDescription const&, u64) const override;
  37. virtual bool can_write(OpenFileDescription const&, u64) const override;
  38. virtual ErrorOr<NonnullOwnPtr<KString>> pseudo_path(OpenFileDescription const&) const override;
  39. virtual StringView class_name() const override { return "FIFO"sv; }
  40. virtual bool is_fifo() const override { return true; }
  41. explicit FIFO(UserID, NonnullOwnPtr<DoubleBuffer> buffer);
  42. unsigned m_writers { 0 };
  43. unsigned m_readers { 0 };
  44. NonnullOwnPtr<DoubleBuffer> m_buffer;
  45. UserID m_uid { 0 };
  46. int m_fifo_id { 0 };
  47. WaitQueue m_read_open_queue;
  48. WaitQueue m_write_open_queue;
  49. Mutex m_open_lock;
  50. };
  51. }