roo_io
API Documentation for roo_io
Loading...
Searching...
No Matches
ringpipe.cpp
Go to the documentation of this file.
2
3namespace roo_io {
4
5RingPipe::RingPipe(size_t capacity)
6 : buffer_(capacity), input_closed_(false), output_closed_(false) {}
7
8size_t RingPipe::write(const byte* data, size_t len) {
9 if (len == 0) return 0;
10 roo::unique_lock<roo::mutex> lock(mutex_);
11 while (buffer_.full() && !output_closed_) {
12 not_full_.wait(lock);
13 }
14 if (input_closed_ || output_closed_) {
15 return 0;
16 }
17 not_empty_.notify_all();
18 return buffer_.write(data, len);
19}
20
21size_t RingPipe::writeFully(const byte* data, size_t len) {
22 size_t written_total = 0;
23 while (len > 0) {
24 size_t written_now = write(data, len);
25 if (written_now == 0) break;
26 data += written_now;
29 }
30 return written_total;
31}
32
34 roo::unique_lock<roo::mutex> lock(mutex_);
35 return output_closed_ || input_closed_ ? 0 : buffer_.free();
36}
37
38size_t RingPipe::tryWrite(const byte* data, size_t len) {
39 if (len == 0) return 0;
40 roo::unique_lock<roo::mutex> lock(mutex_);
41 if (buffer_.full() || input_closed_ || output_closed_) {
42 return 0;
43 }
44 not_empty_.notify_all();
45 return buffer_.write(data, len);
46}
47
48size_t RingPipe::read(byte* data, size_t len) {
49 if (len == 0) return 0;
50 roo::unique_lock<roo::mutex> lock(mutex_);
51 while (buffer_.empty()) {
52 if (input_closed_ || output_closed_) return 0;
53 not_empty_.wait(lock);
54 }
55 if (input_closed_) {
56 return 0;
57 }
58 not_full_.notify_all();
59 return buffer_.read(data, len);
60}
61
63 roo::unique_lock<roo::mutex> lock(mutex_);
64 return buffer_.used();
65}
66
67size_t RingPipe::tryRead(byte* data, size_t len) {
68 if (len == 0) return 0;
69 roo::unique_lock<roo::mutex> lock(mutex_);
70 if (buffer_.empty()) {
71 return 0;
72 }
73 not_full_.notify_all();
74 return buffer_.read(data, len);
75}
76
78 roo::unique_lock<roo::mutex> lock(mutex_);
79 if (input_closed_) {
80 return kClosed;
81 }
82 if (output_closed_ && buffer_.empty()) {
83 return kEndOfStream;
84 }
85 return kOk;
86}
87
89 roo::unique_lock<roo::mutex> lock(mutex_);
90 if (output_closed_) {
91 return kClosed;
92 }
93 if (input_closed_) {
94 return kBrokenPipe;
95 }
96 return kOk;
97}
98
100 roo::unique_lock<roo::mutex> lock(mutex_);
101 input_closed_ = true;
102 buffer_.clear();
103 // Awake all readers and writers.
104 not_full_.notify_all();
105 not_empty_.notify_all();
106}
107
109 roo::unique_lock<roo::mutex> lock(mutex_);
110 output_closed_ = true;
111 // Awake all readers and writers.
112 not_full_.notify_all();
113 not_empty_.notify_all();
114}
115
116} // namespace roo_io
size_t write(const byte *data, size_t len)
Definition ringbuffer.h:29
size_t used() const
Definition ringbuffer.h:16
bool empty() const
Definition ringbuffer.h:20
bool read(byte *b)
Definition ringbuffer.h:58
size_t free() const
Definition ringbuffer.h:17
bool full() const
Definition ringbuffer.h:19
size_t write(const byte *data, size_t len)
Definition ringpipe.cpp:8
size_t tryRead(byte *data, size_t len)
Definition ringpipe.cpp:67
size_t tryWrite(const byte *data, size_t len)
Definition ringpipe.cpp:38
Status inputStatus() const
Definition ringpipe.cpp:77
Status outputStatus() const
Definition ringpipe.cpp:88
size_t availableForRead()
Definition ringpipe.cpp:62
size_t read(byte *data, size_t len)
Definition ringpipe.cpp:48
RingPipe(size_t capacity)
Definition ringpipe.cpp:5
size_t availableForWrite()
Definition ringpipe.cpp:33
size_t writeFully(const byte *data, size_t len)
Definition ringpipe.cpp:21
Definition byte.h:6
roo::basic_string_view< CharT, Traits > basic_string_view
Definition string_view.h:8
Status
Definition status.h:7
@ kBrokenPipe
Definition status.h:70
@ kOk
Definition status.h:8
@ kClosed
Definition status.h:10
@ kEndOfStream
Definition status.h:9