size_t streambuf_fast_read(u8_t *buf, size_t min, size_t max, bool_t *streaming) { size_t sz, w; ASSERT_FIFO_LOCKED(&streambuf_fifo); if (streaming) { *streaming = streambuf_streaming; } sz = fifo_bytes_used(&streambuf_fifo); if (sz < min) { return 0; /* underrun */ } if (sz > max) { sz = max; } w = fifo_bytes_until_rptr_wrap(&streambuf_fifo); if (w < sz) { sz = w; } memcpy(buf, streambuf_buf + streambuf_fifo.rptr, sz); fifo_rptr_incby(&streambuf_fifo, sz); fifo_signal(&streambuf_fifo); if ((streambuf_fifo.rptr == streambuf_fifo.wptr) && streambuf_loop) { streambuf_fifo.rptr = streambuf_lptr; } return sz; }
status_t fifo_write_signal(fifo p, void *data) { status_t rc; assert(p != NULL); assert(data != NULL); if (!fifo_lock(p)) return failure; if (!fifo_add(p, data)) { fifo_unlock(p); return failure; } rc = fifo_signal(p); fifo_unlock(p); return rc; }