#pragma once #include #include #include #include namespace Kernel { class Pipe : public Inode { public: static BAN::ErrorOr> create(const Credentials&); void on_close(int status_flags) override; void on_clone(int status_flags) override; virtual const FileSystem* filesystem() const override { return nullptr; } protected: virtual BAN::ErrorOr read_impl(off_t, BAN::ByteSpan) override; virtual BAN::ErrorOr write_impl(off_t, BAN::ConstByteSpan) override; virtual BAN::ErrorOr fsync_impl() final override { return {}; } virtual bool can_read_impl() const override { return !m_buffer->empty(); } virtual bool can_write_impl() const override { return true; } virtual bool has_error_impl() const override { return m_reading_count == 0; } virtual bool has_hungup_impl() const override { return m_writing_count == 0; } virtual BAN::ErrorOr ioctl_impl(int, void*) override; private: Pipe(const Credentials&); private: Mutex m_mutex; ThreadBlocker m_thread_blocker; BAN::UniqPtr m_buffer; BAN::Atomic m_writing_count { 1 }; BAN::Atomic m_reading_count { 1 }; }; }