mirror of
https://github.com/espressif/esp-idf
synced 2025-03-09 17:19:09 -04:00
fix(freertos): Fixed SMP race condition in xStreamBufferSend()
This commit fixes a race condition in dual-core SMP mode where in the xStreamBufferSend() makes the xTaskWaitingToSend NULL but it may have already been evaluated to not be NULL by xStreamBufferReceive() running on another core and eventually leading to a crash in tasks.c.
This commit is contained in:
parent
69da13031c
commit
1fe57a5d8e
@ -125,6 +125,8 @@ The following functions were modified to accommodate SMP behavior:
|
||||
- Added extra check to see if current blocking task has already been deleted by the other core.
|
||||
- `xStreamBufferReceive()`
|
||||
- Added a critical section for setting `xTaskWaitingToReceive` to `NULL` so that the write is SMP safe.
|
||||
- `xStreamBufferSend()`
|
||||
- Added a critical section for setting `xTaskWaitingToSend` to `NULL` so that the write is SMP safe.
|
||||
|
||||
### Critical Section Changes
|
||||
|
||||
|
@ -774,7 +774,18 @@ size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
|
||||
|
||||
traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer );
|
||||
( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait );
|
||||
pxStreamBuffer->xTaskWaitingToSend = NULL;
|
||||
/* In SMP mode, the task may have been woken and scheduled on
|
||||
* another core. Hence, we must clear the xTaskWaitingToSend
|
||||
* handle in a critical section. */
|
||||
#if ( configNUMBER_OF_CORES > 1 )
|
||||
taskENTER_CRITICAL( &( pxStreamBuffer->xStreamBufferLock ) );
|
||||
#endif /* configNUMBER_OF_CORES > 1 */
|
||||
{
|
||||
pxStreamBuffer->xTaskWaitingToSend = NULL;
|
||||
}
|
||||
#if ( configNUMBER_OF_CORES > 1 )
|
||||
taskEXIT_CRITICAL( &( pxStreamBuffer->xStreamBufferLock ) );
|
||||
#endif /* configNUMBER_OF_CORES > 1 */
|
||||
} while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE );
|
||||
}
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user