Example #1
0
/**
 * Push into fifo
 * @param fifo - fifo descriptor
 * @param item - pointer to item
 * @return 0 - ok, 1 - item pushed and buffer is full
 */
int fifo_push(struct fifo_buffer *fifo, void *item)
{
	memcpy(fifo->buf + fifo->write_pointer, item, fifo->item_size);

	inc_pointer(&fifo->write_pointer, fifo->item_size, fifo->count);

	if(fifo->write_pointer == fifo->read_pointer) { // If fifo is full
		inc_pointer(&fifo->read_pointer, fifo->item_size, fifo->count);
		return 1;
	}

	return 0;
}
Example #2
0
size_t cbuf_read_char(cbuf_t* cbuf, char* c, bool block) {
    DEBUG_ASSERT(cbuf);
    DEBUG_ASSERT(c);

retry:
    if (block) {
        event_wait(&cbuf->event);
    }

    size_t ret = 0;
    {
        AutoSpinLock guard(&cbuf->lock);

        // see if there's data available
        if (cbuf->tail != cbuf->head) {

            *c = cbuf->buf[cbuf->tail];
            cbuf->tail = inc_pointer(cbuf, cbuf->tail, 1);

            if (cbuf->tail == cbuf->head) {
                // we've emptied the buffer, unsignal the event
                event_unsignal(&cbuf->event);
            }

            ret = 1;
        }
    }

    if (block && ret == 0) {
        goto retry;
    }

    return ret;
}
Example #3
0
/**
 * Pop from fifo buffer
 * @param fifo - fifo descriptor
 * @param item - pointer to poped item
 * @return 0 - ok, 1 - buffer is empty
 */
int fifo_pop(struct fifo_buffer *fifo, void *item)
{
	if(fifo->read_pointer == fifo->write_pointer)
		return 1;

	memcpy(item, fifo->buf + fifo->read_pointer, fifo->item_size);
	inc_pointer(&fifo->read_pointer, fifo->item_size, fifo->count);
	return 0;
}
Example #4
0
/**
 * Check fifo buffer is full
 * @param fifo - fifo descriptor
 * @return 1 - buffer is full
 */
int fifo_is_full(struct fifo_buffer *fifo)
{
	int p;
	p = fifo->write_pointer;
	inc_pointer(&p, fifo->item_size, fifo->count);
	if(p == fifo->read_pointer)
		return 1;

	return 0;
}
Example #5
0
size_t cbuf_write_char(cbuf_t* cbuf, char c) {
    DEBUG_ASSERT(cbuf);

    size_t ret = 0;
    {
        AutoSpinLock guard(&cbuf->lock);

        if (cbuf_space_avail(cbuf) > 0) {
            cbuf->buf[cbuf->head] = c;

            cbuf->head = inc_pointer(cbuf, cbuf->head, 1);
            ret = 1;
        }
    }

    if (ret > 0) {
        event_signal(&cbuf->event, true);
    }

    return ret;
}