13 using int_type =
typename Traits::int_type;
14 bool readerClosed =
false;
15 bool writerClosed =
false;
18 std::barrier<> barrier{2};
25 basic_pipebuf(
size_t bufsize = 1024) : readbuf(bufsize), writebuf(bufsize) {
32 if (basic_pipebuf::is_open())
33 basic_pipebuf::overflow(Traits::eof());
36 bool is_open()
const noexcept {
return !writerClosed; }
41 overflow(Traits::eof());
45 int_type underflow()
override {
48 barrier.arrive_and_wait();
51 writerClosed = readerClosed = readerClosed || writerClosed;
52 numLastWritten = this->
pptr() - this->
pbase();
53 assert(numLastWritten <= readbuf.
size());
54 barrier.arrive_and_wait();
55 if (readerClosed && numLastWritten == 0)
59 return Traits::to_int_type(*this->
gptr());
62 int_type overflow(int_type c = Traits::eof())
override {
63 if (c == Traits::eof())
65 barrier.arrive_and_wait();
67 barrier.arrive_and_wait();
69 return (c == Traits::eof()) ? 1 : Traits::eof();