Refactor pvPortRealloc() to improve readability.

This commit is contained in:
Jean-François Milants 2023-04-08 15:30:14 +02:00 committed by JF
parent 611e0ff768
commit e038703efe

View File

@ -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 move_size;
size_t block_size; size_t block_size;
BlockLink_t* pxLink; BlockLink_t* pxLink;
void* pvReturn = NULL; void* pvReturn = NULL;
uint8_t* puc = (uint8_t*) pv; uint8_t* puc = (uint8_t*) pv;
if (xWantedSize > 0) 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
{
// Zero bytes requested, do nothing (according to libc, this behavior implementation defined) // Zero bytes requested, do nothing (according to libc, this behavior implementation defined)
pvReturn = NULL; return NULL;
} }
// Exit with memory block if (pv == NULL) {
return pvReturn; // 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;
}