- BlockingFifo: semaphore management fixed

This commit is contained in:
Wiesner András 2024-04-23 23:35:25 +02:00
parent ca97d1718a
commit d14a4e9c2f
2 changed files with 23 additions and 23 deletions

View File

@ -9,34 +9,34 @@
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
BlockingFifo *eth_bfifo_new(uint32_t size) {
uint32_t allocSize = sizeof(BlockingFifo) + size; // calculate full allocation size
BlockingFifo * fifo = (BlockingFifo *) dynmem_alloc(allocSize); // allocate data block at the end
EthBlockingFifo *eth_bfifo_new(uint32_t size) {
uint32_t allocSize = sizeof(EthBlockingFifo) + size; // calculate full allocation size
EthBlockingFifo * fifo = (EthBlockingFifo *) dynmem_alloc(allocSize); // allocate data block at the end
ASSERT_NULL(fifo);
memset(fifo, 0, sizeof(BlockingFifo));
memset(fifo, 0, sizeof(EthBlockingFifo));
fifo->size = size;
fifo->nonEmpty = ETHLIB_OS_SEM_CREATE(1);
ETHLIB_OS_SEM_WAIT(fifo->nonEmpty); // FIFO is empty
fifo->notFull = ETHLIB_OS_SEM_CREATE(1);
ETHLIB_OS_SEM_POST(fifo->notFull);
return fifo;
}
void eth_bfifo_destroy(BlockingFifo * bfifo) {
void eth_bfifo_destroy(EthBlockingFifo * bfifo) {
ETHLIB_OS_SEM_DESTROY(bfifo->nonEmpty);
ETHLIB_OS_SEM_DESTROY(bfifo->notFull);
bfifo->size = 0;
dynmem_free(bfifo);
}
uint32_t eth_bfifo_get_used(const BlockingFifo *bfifo) {
uint32_t eth_bfifo_get_used(const EthBlockingFifo *bfifo) {
return bfifo->absWriteIdx - bfifo->absReadIdx;
}
uint32_t eth_bfifo_get_free(const BlockingFifo * bfifo) {
uint32_t eth_bfifo_get_free(const EthBlockingFifo * bfifo) {
return bfifo->size - eth_bfifo_get_used(bfifo);
}
uint32_t eth_bfifo_push_try(BlockingFifo * bfifo, const uint8_t * data, uint32_t size) {
uint32_t eth_bfifo_push_try(EthBlockingFifo * bfifo, const uint8_t * data, uint32_t size) {
if (eth_bfifo_get_free(bfifo) == 0) {
return 0;
} else {
@ -44,7 +44,7 @@ uint32_t eth_bfifo_push_try(BlockingFifo * bfifo, const uint8_t * data, uint32_t
}
}
uint32_t eth_bfifo_push(BlockingFifo * bfifo, const uint8_t * data, uint32_t size) {
uint32_t eth_bfifo_push(EthBlockingFifo * bfifo, const uint8_t * data, uint32_t size) {
ETHLIB_OS_SEM_WAIT(bfifo->notFull); // take not full semaphore
// calculate copy size, limit if required
@ -79,7 +79,7 @@ uint32_t eth_bfifo_push(BlockingFifo * bfifo, const uint8_t * data, uint32_t siz
return copySize;
}
uint32_t eth_bfifo_peek(BlockingFifo * bfifo, uint8_t * dst, uint32_t size) {
uint32_t eth_bfifo_peek(EthBlockingFifo * bfifo, uint8_t * dst, uint32_t size) {
// determine copy size
uint32_t usedArea = eth_bfifo_get_used(bfifo);
uint32_t copySize = MIN(size, usedArea);
@ -94,7 +94,7 @@ uint32_t eth_bfifo_peek(BlockingFifo * bfifo, uint8_t * dst, uint32_t size) {
return copySize;
}
uint32_t eth_bfifo_pop(BlockingFifo *bfifo, uint8_t *dst, uint32_t size) {
uint32_t eth_bfifo_pop(EthBlockingFifo *bfifo, uint8_t *dst, uint32_t size) {
ETHLIB_OS_SEM_WAIT(bfifo->nonEmpty);
// if destination is given, then also perform a copy
@ -114,10 +114,10 @@ uint32_t eth_bfifo_pop(BlockingFifo *bfifo, uint8_t *dst, uint32_t size) {
usedArea = eth_bfifo_get_used(bfifo);
if (usedArea > 0) { // FIFO is NOT empty
ETHLIB_OS_SEM_POST(&bfifo->nonEmpty);
ETHLIB_OS_SEM_POST(bfifo->nonEmpty);
}
if (usedArea != bfifo->size) { // FIFO is NOT full
ETHLIB_OS_SEM_POST(&bfifo->notFull);
ETHLIB_OS_SEM_POST(bfifo->notFull);
}
return popSize;

View File

@ -19,27 +19,27 @@ typedef struct {
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
} BlockingFifo;
} EthBlockingFifo;
/**
* Create new blocking FIFO.
* @param size size of the FIFO in bytes
* @return newly allocated FIFO
*/
BlockingFifo * eth_bfifo_new(uint32_t size);
EthBlockingFifo * eth_bfifo_new(uint32_t size);
void eth_bfifo_destroy(BlockingFifo * bfifo);
void eth_bfifo_destroy(EthBlockingFifo * bfifo);
uint32_t eth_bfifo_get_used(const BlockingFifo * bfifo);
uint32_t eth_bfifo_get_used(const EthBlockingFifo * bfifo);
uint32_t eth_bfifo_get_free(const BlockingFifo * bfifo);
uint32_t eth_bfifo_get_free(const EthBlockingFifo * bfifo);
uint32_t eth_bfifo_push(BlockingFifo * bfifo, const uint8_t * data, uint32_t size);
uint32_t eth_bfifo_push(EthBlockingFifo * bfifo, const uint8_t * data, uint32_t size);
uint32_t eth_bfifo_push_try(BlockingFifo * 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(BlockingFifo * bfifo, uint8_t * dst, uint32_t size);
uint32_t eth_bfifo_peek(EthBlockingFifo * bfifo, uint8_t * dst, uint32_t size);
uint32_t eth_bfifo_pop(BlockingFifo *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