16#define PIPE_MAGIC MOS_FOURCC('P', 'I', 'P', 'E')
18#define advance_buffer(buffer, bytes) ((buffer) = (void *) ((char *) (buffer) + (bytes)))
24 mWarn <<
"pipe_io_write: invalid magic";
41 size_t total_written = 0;
84 mWarn <<
"pipe_io_read: invalid magic";
93 size_t total_read = 0;
138 mWarn <<
"pipe_io_close: invalid magic";
143 if (!
pipe->other_closed)
145 pipe->other_closed =
true;
193 const char *type =
"<unknown>";
206 dInfo2<pipe> <<
"pipe is already closed by the other end, '" << type <<
"' closing";
#define MOS_UNREACHABLE()
bool signal_has_pending(void)
Return true if there's a pending signal.
long signal_send_to_thread(Thread *target, signal_t signal)
Send a signal to a thread.
#define phyframe_va(frame)
#define mm_free_pages(frame, npages)
phyframe_t * mm_get_free_pages(size_t npages)
MOSAPI size_t ring_buffer_pos_pop_front(u8 *buffer, ring_buffer_pos_t *pos, u8 *buf, size_t size)
should_inline bool ring_buffer_pos_is_empty(ring_buffer_pos_t *pos)
MOSAPI void ring_buffer_pos_init(ring_buffer_pos_t *pos, size_t capacity)
MOSAPI size_t ring_buffer_pos_push_back(u8 *buffer, ring_buffer_pos_t *pos, const u8 *data, size_t size)
long define_syscall pipe(fd_t *reader, fd_t *writer, u64 flags)
#define statement_expr(type,...)
#define ALIGN_UP_TO_PAGE(addr)
T * create(Args &&...args)
PtrResult< pipe_t > pipe_create(size_t bufsize)
pipeio_t * pipeio_create(pipe_t *pipe)
#define advance_buffer(buffer, bytes)
bool pipe_close_one_end(pipe_t *pipe)
Close one end of the pipe, so that the other end will get EOF.
size_t pipe_write(pipe_t *p, const void *buf, size_t size)
size_t pipe_read(pipe_t *p, void *buf, size_t size)
__nodiscard bool pipe_close_one_end(pipe_t *pipe)
Close one end of the pipe, so that the other end will get EOF.
size_t pipe_write(pipe_t *pipe, const void *buf, size_t size)
size_t pipe_read(pipe_t *pipe, void *buf, size_t size)
__nodiscard bool reschedule_for_waitlist(waitlist_t *waitlist)
#define spinlock_acquire(lock)
#define spinlock_release(lock)
size_t on_write(const void *buf, size_t size) override
void on_closed() override
size_t on_read(void *buf, size_t size) override
bool other_closed
true if the other end of the pipe has been closed
ring_buffer_pos_t buffer_pos
spinlock_t lock
protects the buffer_pos (and thus the buffer)
waitlist_t waitlist
for both reader and writer, only one party can wait on the pipe at a time
#define container_of(ptr, type, member)
void waitlist_init(waitlist_t *list)
size_t waitlist_wake(waitlist_t *list, size_t max_wakeups)