FIFO.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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/FileSystem/File.h>
  8. #include <Kernel/Library/DoubleBuffer.h>
  9. #include <Kernel/Locking/Mutex.h>
  10. #include <Kernel/Tasks/WaitQueue.h>
  11. #include <Kernel/UnixTypes.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<NonnullRefPtr<FIFO>> try_create(UserID);
  22. virtual ~FIFO() override;
  23. UserID uid() const { return m_uid; }
  24. ErrorOr<NonnullRefPtr<OpenFileDescription>> open_direction(Direction);
  25. ErrorOr<NonnullRefPtr<OpenFileDescription>> open_direction_blocking(Direction);
  26. private:
  27. // ^File
  28. virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
  29. virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
  30. virtual ErrorOr<struct stat> stat() const override;
  31. virtual void detach(OpenFileDescription&) override;
  32. virtual bool can_read(OpenFileDescription const&, u64) const override;
  33. virtual bool can_write(OpenFileDescription const&, u64) const override;
  34. virtual ErrorOr<NonnullOwnPtr<KString>> pseudo_path(OpenFileDescription const&) const override;
  35. virtual StringView class_name() const override { return "FIFO"sv; }
  36. virtual bool is_fifo() const override { return true; }
  37. explicit FIFO(UserID, NonnullOwnPtr<DoubleBuffer> buffer);
  38. unsigned m_writers { 0 };
  39. unsigned m_readers { 0 };
  40. NonnullOwnPtr<DoubleBuffer> m_buffer;
  41. UserID m_uid { 0 };
  42. int m_fifo_id { 0 };
  43. WaitQueue m_read_open_queue;
  44. WaitQueue m_write_open_queue;
  45. Mutex m_open_lock;
  46. };
  47. }