From e038703efe134b3f6162051734f0df2d8bc6bb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sat, 8 Apr 2023 15:30:14 +0200 Subject: [PATCH] Refactor pvPortRealloc() to improve readability. --- src/FreeRTOS/heap_4_infinitime.c | 101 +++++++++++++------------------ 1 file changed, 43 insertions(+), 58 deletions(-) diff --git a/src/FreeRTOS/heap_4_infinitime.c b/src/FreeRTOS/heap_4_infinitime.c index 31f34602..14708471 100644 --- a/src/FreeRTOS/heap_4_infinitime.c +++ b/src/FreeRTOS/heap_4_infinitime.c @@ -448,70 +448,55 @@ static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) /*-----------------------------------------------------------*/ -void *pvPortRealloc( void *pv, size_t xWantedSize ) -{ +void* pvPortRealloc(void* pv, size_t xWantedSize) { size_t move_size; size_t block_size; BlockLink_t* pxLink; void* pvReturn = NULL; uint8_t* puc = (uint8_t*) pv; - if (xWantedSize > 0) - { - if (pv != NULL) - { - // The memory being freed will have an BlockLink_t structure immediately before it. - puc -= xHeapStructSize; - - // This casting is to keep the compiler from issuing warnings. - pxLink = (void*) puc; - - // Check allocate block - if ((pxLink->xBlockSize & xBlockAllocatedBit) != 0) - { - // The block is being returned to the heap - it is no longer allocated. - block_size = (pxLink->xBlockSize & ~xBlockAllocatedBit) - xHeapStructSize; - - // Allocate a new buffer - pvReturn = pvPortMalloc(xWantedSize); - - // Check creation and determine the data size to be copied to the new buffer - if (pvReturn != NULL) - { - if (block_size < xWantedSize) - { - move_size = block_size; - } - else - { - move_size = xWantedSize; - } - - // Copy the data from the old buffer to the new one - memcpy(pvReturn, pv, move_size); - - // Free the old buffer - vPortFree(pv); - } - } - else - { - // pv does not point to a valid memory buffer. Allocate a new one - pvReturn = pvPortMalloc(xWantedSize); - } - } - else - { - // pv points to NULL. Allocate a new buffer. - pvReturn = pvPortMalloc(xWantedSize); - } - } - else - { + if (xWantedSize == 0) { // Zero bytes requested, do nothing (according to libc, this behavior implementation defined) - pvReturn = NULL; + return NULL; } - // Exit with memory block - return pvReturn; -} + if (pv == NULL) { + // pv points to NULL. Allocate a new buffer. + return pvPortMalloc(xWantedSize); + } + + // The memory being freed will have an BlockLink_t structure immediately before it. + puc -= xHeapStructSize; + + // This casting is to keep the compiler from issuing warnings. + pxLink = (void*) puc; + + // Check allocate block + if ((pxLink->xBlockSize & xBlockAllocatedBit) != 0) { + // The block is being returned to the heap - it is no longer allocated. + block_size = (pxLink->xBlockSize & ~xBlockAllocatedBit) - xHeapStructSize; + + // Allocate a new buffer + pvReturn = pvPortMalloc(xWantedSize); + + // Check creation and determine the data size to be copied to the new buffer + if (pvReturn != NULL) { + if (block_size < xWantedSize) { + move_size = block_size; + } else { + move_size = xWantedSize; + } + + // Copy the data from the old buffer to the new one + memcpy(pvReturn, pv, move_size); + + // Free the old buffer + vPortFree(pv); + } + } else { + // pv does not point to a valid memory buffer. Allocate a new one + pvReturn = pvPortMalloc(xWantedSize); + } + + return pvReturn; +} \ No newline at end of file