Serenity Operating System
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}