The Pedigree Project 0.1
Pipe.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef PIPE_H
21#define PIPE_H
22
23#include "pedigree/kernel/Log.h"
24#include "pedigree/kernel/compiler.h"
25#include "pedigree/kernel/process/ConditionVariable.h"
26#include "pedigree/kernel/processor/types.h"
27#include "pedigree/kernel/time/Time.h"
28#include "pedigree/kernel/utilities/String.h"
29
30#include "File.h"
31#include "PipeBuffer.h"
32
33#define PIPE_BUF_MAX 4096
34
36class EXPORTED_PUBLIC Pipe : public File {
37 friend class Filesystem;
38 friend class ZombiePipe;
39
40 public:
42 static Pipe* fromFile(File* pF) {
43 if (!(pF->isPipe() || pF->isFifo()))
44 FATAL("Casting non-pipe/fifo File to Pipe!");
45 return reinterpret_cast<Pipe*>(pF);
46 }
47
49 Pipe();
50
52 Pipe(const Pipe& file);
53
54 private:
55 Pipe& operator=(const Pipe&);
56
57 public:
59 Pipe(const String& name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime,
60 Time::Timestamp creationTime, uintptr_t inode, class Filesystem* pFs, size_t size,
61 File* pParent, bool bIsAnonymous = false);
63 virtual ~Pipe();
64
66 virtual int select(bool bWriting = false, int timeout = 0);
67
68 ReadyMask queryReady(bool reading, bool writing) override;
70
71 bool supportsReadinessNotifications() const override {
72 return true;
73 }
74
76 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
77 bool bCanBlock = true);
79 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
80 bool bCanBlock = true);
81
83 virtual bool isPipe() const;
85 virtual bool isFifo() const;
86
87 virtual bool isSeekable() const {
88 return false;
89 }
90
91 virtual void increaseRefCount(bool bIsWriter);
92
95 virtual void decreaseRefCount(bool bIsWriter);
96
98 bool retainVfsReference() override;
99
101 void releaseVfsReference() override;
102
104 size_t readableBytes();
105
107 size_t getReaderCount();
108
110 size_t getWriterCount();
111
118 bool waitForReader(bool bCanBlock);
119
120 class EXPORTED_PUBLIC ReadReservation {
121 public:
122 ReadReservation() = default;
124 ReadReservation(const ReadReservation&) = delete;
125 ReadReservation& operator=(const ReadReservation&) = delete;
126 size_t size() const;
127 void copyTo(uint8_t* destination, size_t count) const;
128 void consume(size_t accepted);
129 void cancel();
130
131 private:
132 friend class Pipe;
133 TerminationDeferral m_Termination;
134 Pipe* m_Pipe = nullptr;
135 PipeBuffer::ReadReservation m_Reservation;
136 };
137
138 class EXPORTED_PUBLIC WriteReservation {
139 public:
140 WriteReservation() = default;
142 WriteReservation(const WriteReservation&) = delete;
143 WriteReservation& operator=(const WriteReservation&) = delete;
144 size_t size() const;
145 PipeBuffer::Result commit(const uint8_t* source, size_t accepted);
146 void cancel();
147
148 private:
149 friend class Pipe;
150 TerminationDeferral m_Termination;
151 Pipe* m_Pipe = nullptr;
152 PipeBuffer::WriteReservation m_Reservation;
153 };
154
155 PipeBuffer::Result reserveRead(size_t maximum, bool block, ReadReservation& reservation);
156 PipeBuffer::Result reserveWrite(size_t maximum, bool block, WriteReservation& reservation);
157 PipeBuffer::Result waitTransfer(bool writing, bool block);
158 PipeBuffer::Result transferTo(Pipe& output, size_t maximum, bool consume, bool block);
159
160 protected:
164
166 volatile bool m_bIsEOF;
167
170
173
174 uint64_t m_WriteGeneration;
175 uint64_t m_ErrorGeneration;
176 uint64_t m_HangupGeneration;
177
180
183
184 bool shouldQueueRetirementLocked();
185
186 static void bufferChanged(void* context);
187
188 virtual bool isBytewise() const {
189 return true;
190 }
191};
192
193#endif
Definition File.h:75
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition File.cc:1369
virtual bool retainVfsReference()
Definition File.cc:910
virtual void releaseVfsReference()
Definition File.cc:914
virtual bool isFifo() const
Definition File.cc:812
virtual bool isPipe() const
Definition File.cc:808
virtual ReadyMask queryReady(bool reading, bool writing)
Definition File.cc:1054
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition File.cc:1376
virtual int select(bool bWriting=false, int timeout=0)
Definition File.cc:1050
Definition Pipe.h:36
volatile bool m_bIsEOF
Definition Pipe.h:166
virtual bool isBytewise() const
Definition Pipe.h:188
bool m_bIsAnonymous
Definition Pipe.h:163
static Pipe * fromFile(File *pF)
Definition Pipe.h:42
size_t m_nLifetimePins
Definition Pipe.h:179
bool m_bRetirementQueued
Definition Pipe.h:182
bool supportsReadinessNotifications() const override
Definition Pipe.h:71
virtual bool isSeekable() const
Definition Pipe.h:87
PipeBuffer m_Buffer
Definition Pipe.h:169
Pipe(const Pipe &file)
ConditionVariable m_ReaderCondition
Definition Pipe.h:172
virtual ReadinessGenerations readinessGenerations()
Definition Readiness.cc:177