optimisaztion in xQueueSend and xQueueReceive

nobody wrote on Thursday, June 23, 2005:

at line 349  and line 474 in queue.c , there is the same code below:

    if( prvUnlockQueue( pxQueue ) )
    {
        if( !xTaskResumeAll() )
        {
            taskYIELD();
        }
    }
    else
    {
        xTaskResumeAll();
    }

But i think in these code if prvUnlockQueue( pxQueue ) return pdTRUE then xTaskResumeAll() must return pdTRUE( if scheduler is not locket nested) , so it’s meaningless to do taskYIELD().  So these code can be changed to:

prvUnlockQueue( pxQueue ) ;
xTaskResumeAll();

rtel wrote on Thursday, June 23, 2005:

This is the most complex part of the code.  Everything is geared at ensuring interrupts are disabled for the shortest possible period. 

You might be right in your comment - with the scheduler suspended unlocking the queue can only move items to the pending ready list - where they will be removed by xTaskResumeAll().

I know there was a lot of thought that went into this code sequence.  It was originally as per or similar to your suggestion.  This one will take a bit of digging time for me to find why the change was made.  It will be good to look again at this in detail.  Out of interest I will run a few black box style tests to see if they ever fail with the change.

In any case the optimisation saving would be minimal - with a couple of tests being removed.

Regards.