1
0
mirror of https://github.com/FreeRTOS/FreeRTOS-Plus-TCP synced 2025-10-21 23:30:39 +08:00

Stream Buffer Const Correctness (#1067)

* Stream Buffer Const Correctness

* cleanup & simplify

* Uncrustify: triggered by comment.

* fix test

* add const for pass by value parameters

* don't change parameters

* remove pass by value parameter consts

---------

Co-authored-by: Holden <holden-zenithaerotech.com>
Co-authored-by: Holden <68555040+holden-zenith@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Holden <holden@zenithaerotech.com>
Co-authored-by: Tony Josi <tonyjosi@amazon.com>
This commit is contained in:
Holden
2024-01-09 23:36:44 -05:00
committed by GitHub
parent 15b2f81bd4
commit 7af0bfe578
2 changed files with 91 additions and 135 deletions

View File

@@ -32,17 +32,14 @@
/* Standard includes. */
#include <stdint.h>
#include <string.h>
/* FreeRTOS includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
/* FreeRTOS+TCP includes. */
#include "FreeRTOS_IP.h"
#include "FreeRTOS_UDP_IP.h"
#include "FreeRTOS_Sockets.h"
#include "FreeRTOS_IP_Private.h"
/**
@@ -53,21 +50,21 @@
* @return The space between uxLower and uxUpper, which equals to the distance
* minus 1.
*/
size_t uxStreamBufferSpace( const StreamBuffer_t * pxBuffer,
const size_t uxLower,
const size_t uxUpper )
size_t uxStreamBufferSpace( const StreamBuffer_t * const pxBuffer,
size_t uxLower,
size_t uxUpper )
{
size_t uxCount;
const size_t uxLength = pxBuffer->LENGTH;
size_t uxCount = uxLength + uxUpper - uxLower - 1U;
uxCount = pxBuffer->LENGTH + uxUpper - uxLower - 1U;
if( uxCount >= pxBuffer->LENGTH )
if( uxCount >= uxLength )
{
uxCount -= pxBuffer->LENGTH;
uxCount -= uxLength;
}
return uxCount;
}
/*-----------------------------------------------------------*/
/**
* @brief Get the distance between lower and upper value provided to the function.
@@ -76,21 +73,21 @@ size_t uxStreamBufferSpace( const StreamBuffer_t * pxBuffer,
* @param[in] uxUpper The upper value.
* @return The distance between uxLower and uxUpper.
*/
size_t uxStreamBufferDistance( const StreamBuffer_t * pxBuffer,
const size_t uxLower,
const size_t uxUpper )
size_t uxStreamBufferDistance( const StreamBuffer_t * const pxBuffer,
size_t uxLower,
size_t uxUpper )
{
size_t uxCount;
const size_t uxLength = pxBuffer->LENGTH;
size_t uxCount = uxLength + uxUpper - uxLower;
uxCount = pxBuffer->LENGTH + uxUpper - uxLower;
if( uxCount >= pxBuffer->LENGTH )
if( uxCount >= uxLength )
{
uxCount -= pxBuffer->LENGTH;
uxCount -= uxLength;
}
return uxCount;
}
/*-----------------------------------------------------------*/
/**
* @brief Get the number of items which can be added to the buffer at
@@ -99,12 +96,9 @@ size_t uxStreamBufferDistance( const StreamBuffer_t * pxBuffer,
* @return The number of items which can still be added to uxHead
* before hitting on uxTail
*/
size_t uxStreamBufferGetSpace( const StreamBuffer_t * pxBuffer )
size_t uxStreamBufferGetSpace( const StreamBuffer_t * const pxBuffer )
{
size_t uxHead = pxBuffer->uxHead;
size_t uxTail = pxBuffer->uxTail;
return uxStreamBufferSpace( pxBuffer, uxHead, uxTail );
return uxStreamBufferSpace( pxBuffer, pxBuffer->uxHead, pxBuffer->uxTail );
}
/*-----------------------------------------------------------*/
@@ -114,12 +108,9 @@ size_t uxStreamBufferGetSpace( const StreamBuffer_t * pxBuffer )
* @return Distance between uxFront and uxTail or the number of items
* which can still be added to uxFront, before hitting on uxTail.
*/
size_t uxStreamBufferFrontSpace( const StreamBuffer_t * pxBuffer )
size_t uxStreamBufferFrontSpace( const StreamBuffer_t * const pxBuffer )
{
size_t uxFront = pxBuffer->uxFront;
size_t uxTail = pxBuffer->uxTail;
return uxStreamBufferSpace( pxBuffer, uxFront, uxTail );
return uxStreamBufferSpace( pxBuffer, pxBuffer->uxFront, pxBuffer->uxTail );
}
/*-----------------------------------------------------------*/
@@ -130,12 +121,9 @@ size_t uxStreamBufferFrontSpace( const StreamBuffer_t * pxBuffer )
* @return The number of items which can be read from the tail before
* reaching the head.
*/
size_t uxStreamBufferGetSize( const StreamBuffer_t * pxBuffer )
size_t uxStreamBufferGetSize( const StreamBuffer_t * const pxBuffer )
{
size_t uxHead = pxBuffer->uxHead;
size_t uxTail = pxBuffer->uxTail;
return uxStreamBufferDistance( pxBuffer, uxTail, uxHead );
return uxStreamBufferDistance( pxBuffer, pxBuffer->uxTail, pxBuffer->uxHead );
}
/*-----------------------------------------------------------*/
@@ -145,20 +133,17 @@ size_t uxStreamBufferGetSize( const StreamBuffer_t * pxBuffer )
* @param[in] pxBuffer The circular stream buffer.
* @return The space between the mid pointer and the head.
*/
size_t uxStreamBufferMidSpace( const StreamBuffer_t * pxBuffer )
size_t uxStreamBufferMidSpace( const StreamBuffer_t * const pxBuffer )
{
size_t uxHead = pxBuffer->uxHead;
size_t uxMid = pxBuffer->uxMid;
return uxStreamBufferDistance( pxBuffer, uxMid, uxHead );
return uxStreamBufferDistance( pxBuffer, pxBuffer->uxMid, pxBuffer->uxHead );
}
/*-----------------------------------------------------------*/
/**
* @brief Move Clear the stream buffer.
* @brief Clear the stream buffer.
* @param[in] pxBuffer The circular stream buffer.
*/
void vStreamBufferClear( StreamBuffer_t * pxBuffer )
void vStreamBufferClear( StreamBuffer_t * const pxBuffer )
{
/* Make the circular buffer empty */
pxBuffer->uxHead = 0U;
@@ -174,11 +159,12 @@ void vStreamBufferClear( StreamBuffer_t * pxBuffer )
* @param[in] pxBuffer The circular stream buffer.
* @param[in] uxCount The byte count by which the mid pointer is to be moved.
*/
void vStreamBufferMoveMid( StreamBuffer_t * pxBuffer,
void vStreamBufferMoveMid( StreamBuffer_t * const pxBuffer,
size_t uxCount )
{
/* Increment uxMid, but no further than uxHead */
size_t uxSize = uxStreamBufferMidSpace( pxBuffer );
const size_t uxLength = pxBuffer->LENGTH;
const size_t uxSize = uxStreamBufferMidSpace( pxBuffer );
size_t uxMid = pxBuffer->uxMid;
size_t uxMoveCount = uxCount;
@@ -189,9 +175,9 @@ void vStreamBufferMoveMid( StreamBuffer_t * pxBuffer,
uxMid += uxMoveCount;
if( uxMid >= pxBuffer->LENGTH )
if( uxMid >= uxLength )
{
uxMid -= pxBuffer->LENGTH;
uxMid -= uxLength;
}
pxBuffer->uxMid = uxMid;
@@ -207,14 +193,13 @@ void vStreamBufferMoveMid( StreamBuffer_t * pxBuffer,
* @param[in] uxRight The right value pointer in the stream buffer.
* @return pdTRUE if uxLeft <= uxRight, else pdFALSE.
*/
BaseType_t xStreamBufferLessThenEqual( const StreamBuffer_t * pxBuffer,
const size_t uxLeft,
const size_t uxRight )
BaseType_t xStreamBufferLessThenEqual( const StreamBuffer_t * const pxBuffer,
size_t uxLeft,
size_t uxRight )
{
BaseType_t xReturn = pdFALSE;
size_t uxTail = pxBuffer->uxTail;
const size_t uxTail = pxBuffer->uxTail;
/* Returns true if ( uxLeft <= uxRight ) */
if( ( uxLeft - uxTail ) <= ( uxRight - uxTail ) )
{
xReturn = pdTRUE;
@@ -235,11 +220,11 @@ BaseType_t xStreamBufferLessThenEqual( const StreamBuffer_t * pxBuffer,
* actual number of available bytes since this is a circular buffer and tail
* can loop back to the start of the buffer).
*/
size_t uxStreamBufferGetPtr( StreamBuffer_t * pxBuffer,
uint8_t ** ppucData )
size_t uxStreamBufferGetPtr( StreamBuffer_t * const pxBuffer,
uint8_t ** const ppucData )
{
size_t uxNextTail = pxBuffer->uxTail;
size_t uxSize = uxStreamBufferGetSize( pxBuffer );
const size_t uxNextTail = pxBuffer->uxTail;
const size_t uxSize = uxStreamBufferGetSize( pxBuffer );
*ppucData = pxBuffer->ucArray + uxNextTail;
@@ -259,15 +244,13 @@ size_t uxStreamBufferGetPtr( StreamBuffer_t * pxBuffer,
*
* @return The number of bytes added to the buffer.
*/
size_t uxStreamBufferAdd( StreamBuffer_t * pxBuffer,
size_t uxStreamBufferAdd( StreamBuffer_t * const pxBuffer,
size_t uxOffset,
const uint8_t * pucData,
const uint8_t * const pucData,
size_t uxByteCount )
{
size_t uxSpace, uxNextHead, uxFirst;
size_t uxCount = uxByteCount;
uxSpace = uxStreamBufferGetSpace( pxBuffer );
size_t uxCount;
size_t uxSpace = uxStreamBufferGetSpace( pxBuffer );
/* If uxOffset > 0, items can be placed in front of uxHead */
if( uxSpace > uxOffset )
@@ -281,20 +264,21 @@ size_t uxStreamBufferAdd( StreamBuffer_t * pxBuffer,
/* The number of bytes that can be written is the minimum of the number of
* bytes requested and the number available. */
uxCount = FreeRTOS_min_size_t( uxSpace, uxCount );
uxCount = FreeRTOS_min_size_t( uxSpace, uxByteCount );
if( uxCount != 0U )
{
uxNextHead = pxBuffer->uxHead;
const size_t uxLength = pxBuffer->LENGTH;
size_t uxNextHead = pxBuffer->uxHead;
if( uxOffset != 0U )
{
/* ( uxOffset > 0 ) means: write in front if the uxHead marker */
uxNextHead += uxOffset;
if( uxNextHead >= pxBuffer->LENGTH )
if( uxNextHead >= uxLength )
{
uxNextHead -= pxBuffer->LENGTH;
uxNextHead -= uxLength;
}
}
@@ -303,7 +287,7 @@ size_t uxStreamBufferAdd( StreamBuffer_t * pxBuffer,
/* Calculate the number of bytes that can be added in the first
* write - which may be less than the total number of bytes that need
* to be added if the buffer will wrap back to the beginning. */
uxFirst = FreeRTOS_min_size_t( pxBuffer->LENGTH - uxNextHead, uxCount );
const size_t uxFirst = FreeRTOS_min_size_t( uxLength - uxNextHead, uxCount );
/* Write as many bytes as can be written in the first write. */
( void ) memcpy( &( pxBuffer->ucArray[ uxNextHead ] ), pucData, uxFirst );
@@ -327,9 +311,9 @@ size_t uxStreamBufferAdd( StreamBuffer_t * pxBuffer,
/* ( uxOffset == 0 ) means: write at uxHead position */
uxNextHead += uxCount;
if( uxNextHead >= pxBuffer->LENGTH )
if( uxNextHead >= uxLength )
{
uxNextHead -= pxBuffer->LENGTH;
uxNextHead -= uxLength;
}
pxBuffer->uxHead = uxNextHead;
@@ -360,16 +344,16 @@ size_t uxStreamBufferAdd( StreamBuffer_t * pxBuffer,
*
* @return The count of the bytes read.
*/
size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
size_t uxStreamBufferGet( StreamBuffer_t * const pxBuffer,
size_t uxOffset,
uint8_t * pucData,
uint8_t * const pucData,
size_t uxMaxCount,
BaseType_t xPeek )
{
size_t uxSize, uxCount, uxFirst, uxNextTail;
size_t uxCount;
/* How much data is available? */
uxSize = uxStreamBufferGetSize( pxBuffer );
size_t uxSize = uxStreamBufferGetSize( pxBuffer );
if( uxSize > uxOffset )
{
@@ -383,17 +367,18 @@ size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
/* Use the minimum of the wanted bytes and the available bytes. */
uxCount = FreeRTOS_min_size_t( uxSize, uxMaxCount );
if( uxCount > 0U )
if( uxCount != 0U )
{
uxNextTail = pxBuffer->uxTail;
const size_t uxLength = pxBuffer->LENGTH;
size_t uxNextTail = pxBuffer->uxTail;
if( uxOffset != 0U )
{
uxNextTail += uxOffset;
if( uxNextTail >= pxBuffer->LENGTH )
if( uxNextTail >= uxLength )
{
uxNextTail -= pxBuffer->LENGTH;
uxNextTail -= uxLength;
}
}
@@ -402,7 +387,7 @@ size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
/* Calculate the number of bytes that can be read - which may be
* less than the number wanted if the data wraps around to the start of
* the buffer. */
uxFirst = FreeRTOS_min_size_t( pxBuffer->LENGTH - uxNextTail, uxCount );
const size_t uxFirst = FreeRTOS_min_size_t( uxLength - uxNextTail, uxCount );
/* Obtain the number of bytes it is possible to obtain in the first
* read. */
@@ -412,7 +397,7 @@ size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
* that could be read in the first read... */
if( uxCount > uxFirst )
{
/*...then read the remaining bytes from the start of the buffer. */
/* ...then read the remaining bytes from the start of the buffer. */
( void ) memcpy( &( pucData[ uxFirst ] ), pxBuffer->ucArray, uxCount - uxFirst );
}
}
@@ -423,9 +408,9 @@ size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
* the buffer. */
uxNextTail += uxCount;
if( uxNextTail >= pxBuffer->LENGTH )
if( uxNextTail >= uxLength )
{
uxNextTail -= pxBuffer->LENGTH;
uxNextTail -= uxLength;
}
pxBuffer->uxTail = uxNextTail;
@@ -434,3 +419,4 @@ size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
return uxCount;
}
/*-----------------------------------------------------------*/

View File

@@ -28,8 +28,7 @@
/*
* FreeRTOS_Stream_Buffer.h
*
* A circular character buffer
* An implementation of a circular buffer without a length field
* An implementation of a circular character buffer without a length field
* If LENGTH defines the size of the buffer, a maximum of (LENGTH-1) bytes can be stored
* In order to add or read data from the buffer, memcpy() will be called at most 2 times
*/
@@ -43,9 +42,7 @@
#endif
/* *INDENT-ON* */
/**
* structure to store all the details of a stream buffer.
*/
/* Struct to store all the details of a stream buffer. */
typedef struct xSTREAM_BUFFER
{
volatile size_t uxTail; /**< next item to read */
@@ -56,69 +53,42 @@ typedef struct xSTREAM_BUFFER
uint8_t ucArray[ sizeof( size_t ) ]; /**< array big enough to store any pointer address */
} StreamBuffer_t;
void vStreamBufferClear( StreamBuffer_t * pxBuffer );
/*-----------------------------------------------------------*/
size_t uxStreamBufferSpace( const StreamBuffer_t * const pxBuffer,
size_t uxLower,
size_t uxUpper );
size_t uxStreamBufferSpace( const StreamBuffer_t * pxBuffer,
const size_t uxLower,
const size_t uxUpper );
/*-----------------------------------------------------------*/
size_t uxStreamBufferDistance( const StreamBuffer_t * const pxBuffer,
size_t uxLower,
size_t uxUpper );
size_t uxStreamBufferDistance( const StreamBuffer_t * pxBuffer,
const size_t uxLower,
const size_t uxUpper );
/*-----------------------------------------------------------*/
size_t uxStreamBufferGetSpace( const StreamBuffer_t * const pxBuffer );
size_t uxStreamBufferGetSpace( const StreamBuffer_t * pxBuffer );
/*-----------------------------------------------------------*/
size_t uxStreamBufferFrontSpace( const StreamBuffer_t * const pxBuffer );
size_t uxStreamBufferFrontSpace( const StreamBuffer_t * pxBuffer );
/*-----------------------------------------------------------*/
size_t uxStreamBufferGetSize( const StreamBuffer_t * pxBuffer );
/*-----------------------------------------------------------*/
size_t uxStreamBufferGetSize( const StreamBuffer_t * const pxBuffer );
size_t uxStreamBufferMidSpace( const StreamBuffer_t * pxBuffer );
/*-----------------------------------------------------------*/
void vStreamBufferMoveMid( StreamBuffer_t * pxBuffer,
size_t uxCount );
/*-----------------------------------------------------------*/
void vStreamBufferClear( StreamBuffer_t * const pxBuffer );
BaseType_t xStreamBufferLessThenEqual( const StreamBuffer_t * pxBuffer,
const size_t uxLeft,
const size_t uxRight );
/*-----------------------------------------------------------*/
void vStreamBufferMoveMid( StreamBuffer_t * const pxBuffer,
const size_t uxCount );
size_t uxStreamBufferGetPtr( StreamBuffer_t * pxBuffer,
uint8_t ** ppucData );
BaseType_t xStreamBufferLessThenEqual( const StreamBuffer_t * const pxBuffer,
size_t uxLeft,
size_t uxRight );
/*
* Add bytes to a stream buffer.
*
* pxBuffer - The buffer to which the bytes will be added.
* uxOffset - If uxOffset > 0, data will be written at an offset from uxHead
* while uxHead will not be moved yet.
* pucData - A pointer to the data to be added.
* uxCount - The number of bytes to add.
*/
size_t uxStreamBufferAdd( StreamBuffer_t * pxBuffer,
size_t uxStreamBufferGetPtr( StreamBuffer_t * const pxBuffer,
uint8_t ** const ppucData );
size_t uxStreamBufferAdd( StreamBuffer_t * const pxBuffer,
size_t uxOffset,
const uint8_t * pucData,
const uint8_t * const pucData,
size_t uxByteCount );
/*
* Read bytes from a stream buffer.
*
* pxBuffer - The buffer from which the bytes will be read.
* uxOffset - Can be used to read data located at a certain offset from 'uxTail'.
* pucData - A pointer to the buffer into which data will be read.
* uxMaxCount - The number of bytes to read.
* xPeek - If set to pdTRUE the data will remain in the buffer.
*/
size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
size_t uxStreamBufferGet( StreamBuffer_t * const pxBuffer,
size_t uxOffset,
uint8_t * pucData,
uint8_t * const pucData,
size_t uxMaxCount,
BaseType_t xPeek );
@@ -128,4 +98,4 @@ size_t uxStreamBufferGet( StreamBuffer_t * pxBuffer,
#endif
/* *INDENT-ON* */
#endif /* !defined( FREERTOS_STREAM_BUFFER_H ) */
#endif /* FREERTOS_STREAM_BUFFER_H */