/** * 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; }
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; }
/** * 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; }
/** * 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; }
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; }