EtherLib/blocking_fifo.h

46 lines
1.3 KiB
C

//
// Created by epagris on 2023.11.22..
//
#ifndef ETHERLIB_TEST_BLOCKING_FIFO_H
#define ETHERLIB_TEST_BLOCKING_FIFO_H
#include <stdint.h>
#include <etherlib_options.h>
/**
* Blocking FIFO
*/
typedef struct {
uint32_t readIdx; ///< Read index
uint32_t absReadIdx; ///< Absolute read index
uint32_t writeIdx; ///< Write index
uint32_t absWriteIdx; ///< Absolute write index
uint32_t size; ///< Size of the storage area
ETHLIB_OS_SEM_TYPE notFull, nonEmpty; ///< Semaphore, protecting read and write operations
uint8_t data[]; ///< Window data storage
} EthBlockingFifo;
/**
* Create new blocking FIFO.
* @param size size of the FIFO in bytes
* @return newly allocated FIFO
*/
EthBlockingFifo * eth_bfifo_new(uint32_t size);
void eth_bfifo_destroy(EthBlockingFifo * bfifo);
uint32_t eth_bfifo_get_used(const EthBlockingFifo * bfifo);
uint32_t eth_bfifo_get_free(const EthBlockingFifo * bfifo);
uint32_t eth_bfifo_push(EthBlockingFifo * bfifo, const uint8_t * data, uint32_t size);
uint32_t eth_bfifo_push_try(EthBlockingFifo * bfifo, const uint8_t * data, uint32_t size);
uint32_t eth_bfifo_peek(EthBlockingFifo * bfifo, uint8_t * dst, uint32_t size);
uint32_t eth_bfifo_pop(EthBlockingFifo *bfifo, uint8_t *dst, uint32_t size);
#endif //ETHERLIB_TEST_BLOCKING_FIFO_H