From d14a4e9c2f15b7f055cc295db6cbca59f0478990 Mon Sep 17 00:00:00 2001 From: Epagris Date: Tue, 23 Apr 2024 23:35:25 +0200 Subject: [PATCH] - BlockingFifo: semaphore management fixed --- blocking_fifo.c | 28 ++++++++++++++-------------- blocking_fifo.h | 18 +++++++++--------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/blocking_fifo.c b/blocking_fifo.c index 1088ff8..f7768c5 100644 --- a/blocking_fifo.c +++ b/blocking_fifo.c @@ -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; diff --git a/blocking_fifo.h b/blocking_fifo.h index 835cfca..d11f2c6 100644 --- a/blocking_fifo.h +++ b/blocking_fifo.h @@ -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