mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-09 20:41:14 +00:00
fix(freertos): Fixed SMP race condition in stream_buffers.c
This commit fixes a race condition in dual-core SMP mode where in the xStreamBufferReceive() makes the xTaskWaitingToReceive NULL but it may have already been evaluated to not be NULL by xStreamBufferSend() running on another core and eventually leading to a crash in tasks.c.
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2023 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileContributor: 2023-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
@@ -977,7 +977,19 @@ size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
|
||||
/* Wait for data to be available. */
|
||||
traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer );
|
||||
( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait );
|
||||
pxStreamBuffer->xTaskWaitingToReceive = NULL;
|
||||
|
||||
/* In SMP mode, the task may have been woken and scheduled on
|
||||
* another core. Hence, we must clear the xTaskWaitingToReceive
|
||||
* handle in a critical section. */
|
||||
#if ( configNUMBER_OF_CORES > 1 )
|
||||
taskENTER_CRITICAL( &( pxStreamBuffer->xStreamBufferLock ) );
|
||||
#endif /* configNUMBER_OF_CORES > 1 */
|
||||
{
|
||||
pxStreamBuffer->xTaskWaitingToReceive = NULL;
|
||||
}
|
||||
#if ( configNUMBER_OF_CORES > 1 )
|
||||
taskEXIT_CRITICAL( &( pxStreamBuffer->xStreamBufferLock ) );
|
||||
#endif /* configNUMBER_OF_CORES > 1 */
|
||||
|
||||
/* Recheck the data available after blocking. */
|
||||
xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );
|
||||
@@ -1421,7 +1433,7 @@ static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||
* result in confusion as to what is actually being observed. */
|
||||
const BaseType_t xWriteValue = 0x55;
|
||||
configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer );
|
||||
(void)xWriteValue;
|
||||
( void ) xWriteValue;
|
||||
} /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user