Skip to content

Commit

Permalink
update task notification as PR625
Browse files Browse the repository at this point in the history
  • Loading branch information
kar-rahul-aws committed Sep 25, 2023
1 parent 2bc6188 commit cdc6a0e
Showing 1 changed file with 54 additions and 34 deletions.
88 changes: 54 additions & 34 deletions tasks.c
Original file line number Diff line number Diff line change
Expand Up @@ -4890,8 +4890,8 @@ void vTaskPlaceOnEventList( List_t * const pxEventList,

configASSERT( pxEventList );

/* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE
* SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */
/* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED AND THE
* QUEUE BEING ACCESSED LOCKED. */

/* Place the event list item of the TCB in the appropriate event list.
* This is placed in the list in priority order so the highest priority task
Expand Down Expand Up @@ -7101,22 +7101,29 @@ TickType_t uxTaskResetEventItemValue( void )
configASSERT( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES );

taskENTER_CRITICAL();

/* Only block if the notification count is not already non-zero. */
if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] == 0UL )
{
/* Only block if the notification count is not already non-zero. */
if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] == 0UL )
/* Mark this task as waiting for a notification. */
pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION;

if( xTicksToWait > ( TickType_t ) 0 )
{
/* Mark this task as waiting for a notification. */
pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION;
traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWaitOn );

if( xTicksToWait > ( TickType_t ) 0 )
{
prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );
traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWaitOn );
/* Suspend the scheduler before enabling interrupts. */
vTaskSuspendAll();
taskEXIT_CRITICAL();

prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );

/* All ports are written to allow a yield in a critical
* section (some will yield immediately, others wait until the
* critical section exits) - but it is not something that
* application code should ever do. */
/* All ports are written to allow a yield in a critical
* section (some will yield immediately, others wait until the
* critical section exits) - but it is not something that
* application code should ever do. */
if( xTaskResumeAll() == pdFALSE )
{
#if ( configNUMBER_OF_CORES == 1 )
{
portYIELD_WITHIN_API();
Expand All @@ -7134,10 +7141,13 @@ TickType_t uxTaskResetEventItemValue( void )
}
else
{
mtCOVERAGE_TEST_MARKER();
taskEXIT_CRITICAL();
}
}
taskEXIT_CRITICAL();
else
{
taskEXIT_CRITICAL();
}

taskENTER_CRITICAL();
{
Expand Down Expand Up @@ -7187,27 +7197,34 @@ TickType_t uxTaskResetEventItemValue( void )
configASSERT( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES );

taskENTER_CRITICAL();

/* Only block if a notification is not already pending. */
if( pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] != taskNOTIFICATION_RECEIVED )
{
/* Only block if a notification is not already pending. */
if( pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] != taskNOTIFICATION_RECEIVED )
/* Clear bits in the task's notification value as bits may get
* set by the notifying task or interrupt. This can be used to
* clear the value to zero. */
pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] &= ~ulBitsToClearOnEntry;

/* Mark this task as waiting for a notification. */
pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION;

if( xTicksToWait > ( TickType_t ) 0 )
{
/* Clear bits in the task's notification value as bits may get
* set by the notifying task or interrupt. This can be used to
* clear the value to zero. */
pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] &= ~ulBitsToClearOnEntry;
traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWaitOn );

/* Mark this task as waiting for a notification. */
pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION;
/* Suspend the scheduler before enabling interrupts. */
vTaskSuspendAll();
taskEXIT_CRITICAL();

if( xTicksToWait > ( TickType_t ) 0 )
{
prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );
traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWaitOn );
prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );

/* All ports are written to allow a yield in a critical
* section (some will yield immediately, others wait until the
* critical section exits) - but it is not something that
* application code should ever do. */
/* All ports are written to allow a yield in a critical
* section (some will yield immediately, others wait until the
* critical section exits) - but it is not something that
* application code should ever do. */
if( xTaskResumeAll() == pdFALSE )
{
#if ( configNUMBER_OF_CORES == 1 )
{
portYIELD_WITHIN_API();
Expand All @@ -7225,10 +7242,13 @@ TickType_t uxTaskResetEventItemValue( void )
}
else
{
mtCOVERAGE_TEST_MARKER();
taskEXIT_CRITICAL();
}
}
taskEXIT_CRITICAL();
else
{
taskEXIT_CRITICAL();
}

taskENTER_CRITICAL();
{
Expand Down

0 comments on commit cdc6a0e

Please sign in to comment.