Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}