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