7 explicit PipeStoragePin(
Pipe& pipe) : m_Pipe(pipe.retainVfsReference() ? &pipe : nullptr) {}
10 m_Pipe->releaseVfsReference();
13 explicit operator bool()
const {
14 return m_Pipe !=
nullptr;
18 PipeStoragePin(
const PipeStoragePin&) =
delete;
19 PipeStoragePin& operator=(
const PipeStoragePin&) =
delete;
25Pipe::ReadReservation::~ReadReservation() {
29size_t Pipe::ReadReservation::size()
const {
30 return m_Reservation.size();
33void Pipe::ReadReservation::copyTo(uint8_t* destination,
size_t count)
const {
34 m_Reservation.copyTo(destination, count);
37void Pipe::ReadReservation::consume(
size_t accepted) {
38 m_Reservation.consume(accepted);
46void Pipe::ReadReservation::cancel() {
50Pipe::WriteReservation::~WriteReservation() {
54size_t Pipe::WriteReservation::size()
const {
55 return m_Reservation.size();
58PipeBuffer::Result Pipe::WriteReservation::commit(
const uint8_t* source,
size_t accepted) {
59 const auto result = m_Reservation.commit(source, accepted);
71void Pipe::WriteReservation::cancel() {
72 m_Reservation.cancel();
80PipeBuffer::Result Pipe::reserveRead(
size_t maximum,
bool block, ReadReservation& reservation) {
81 if (reservation.m_Pipe) {
82 return {PipeBuffer::Status::Invalid, 0};
85 return {PipeBuffer::Status::Closed, 0};
87 const auto result =
m_Buffer.reserveRead(maximum, block, reservation.m_Reservation);
88 if (result.status == PipeBuffer::Status::Ready && result.count) {
89 reservation.m_Pipe =
this;
96PipeBuffer::Result Pipe::reserveWrite(
size_t maximum,
bool block, WriteReservation& reservation) {
97 if (reservation.m_Pipe) {
98 return {PipeBuffer::Status::Invalid, 0};
101 return {PipeBuffer::Status::Closed, 0};
103 const auto result =
m_Buffer.reserveWrite(maximum, block, reservation.m_Reservation);
104 if (result.status == PipeBuffer::Status::Ready && result.count) {
105 reservation.m_Pipe =
this;
113 PipeStoragePin pin(*
this);
114 return pin ?
m_Buffer.waitTransfer(writing, block)
119 PipeStoragePin inputPin(*
this);
120 PipeStoragePin outputPin(output);
121 if (!inputPin || !outputPin) {
122 return {PipeBuffer::Status::Closed, 0};
124 const auto result =
m_Buffer.transferTo(output.m_Buffer, maximum, consume, block);
126 output.publishEvent(FileEvents::Modify);
void publishEvent(FileEventMask mask, const StringView &name=StringView(), bool targetIsDirectory=false)
void releaseVfsReference() override
bool retainVfsReference() override