]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/Common/Minimal/QueueSet.c
Fix buffer clean up in \FreeRTOS_Plus_TCP_Minimal_Windows_Simulator\demo_logging.c.
[freertos] / FreeRTOS / Demo / Common / Minimal / QueueSet.c
index 9f346bb5a7f3d483ef832ed6f95db3a64a8c25f1..528ec06c08c2932c5e9965dee417387a4e5b80ad 100644 (file)
@@ -138,9 +138,17 @@ static BaseType_t prvCheckReceivedValueWithinExpectedRange( uint32_t ulReceived,
 \r
 /*\r
  * Increase test coverage by occasionally change the priorities of the two tasks\r
- * relative to each other. */\r
+ * relative to each other.\r
+ */\r
 static void prvChangeRelativePriorities( void );\r
 \r
+/*\r
+ * Queue overwrites can only be performed on queues of length of one, requiring\r
+ * a special test function so a queue of length 1 can temporarily be added to a\r
+ * set.\r
+ */\r
+static void prvTestQueueOverwriteWithQueueSet( void );\r
+\r
 /*\r
  * Local pseudo random number seed and return functions.  Used to avoid calls\r
  * to the standard library.\r
@@ -599,6 +607,71 @@ uint32_t ulTxValueSnapshot = ulISRTxValue;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+static void prvTestQueueOverwriteWithQueueSet( void )\r
+{\r
+uint32_t ulValueToSend = 0, ulValueReceived = 0;\r
+QueueHandle_t xQueueHandle = NULL, xReceivedHandle = NULL;\r
+const UBaseType_t xLengthOfOne = ( UBaseType_t ) 1;\r
+\r
+       /* Create a queue that has a length of one - a requirement in order to call\r
+       xQueueOverwrite.  This will get deleted again when this test completes. */\r
+       xQueueHandle = xQueueCreate( xLengthOfOne, sizeof( uint32_t ) );\r
+\r
+       if( xQueueHandle != NULL )\r
+       {\r
+               xQueueAddToSet( xQueueHandle, xQueueSet );\r
+\r
+               /* Add an item to the queue then ensure the queue set correctly\r
+               indicates that one item is available, and that that item is indeed the\r
+               queue written to. */\r
+               xQueueSend( xQueueHandle, ( void * ) &ulValueToSend, 0 );\r
+               if( uxQueueMessagesWaiting( xQueueSet ) != ( UBaseType_t ) 1 )\r
+               {\r
+                       /* Expected one item in the queue set. */\r
+                       xQueueSetTasksStatus = pdFAIL;\r
+               }\r
+               xQueuePeek( xQueueSet, &xReceivedHandle, queuesetDONT_BLOCK );\r
+               if( xReceivedHandle != xQueueHandle )\r
+               {\r
+                       /* Wrote to xQueueHandle so expected xQueueHandle to be the handle\r
+                       held in the queue set. */\r
+                       xQueueSetTasksStatus = pdFAIL;\r
+               }\r
+\r
+               /* Now overwrite the value in the queue and ensure the queue set state\r
+               doesn't change as the number of items in the queues within the set have\r
+               not changed. */\r
+               ulValueToSend++;\r
+               xQueueOverwrite( xQueueHandle, ( void * ) &ulValueToSend );\r
+               if( uxQueueMessagesWaiting( xQueueSet ) != ( UBaseType_t ) 1 )\r
+               {\r
+                       /* Still expected one item in the queue set. */\r
+                       xQueueSetTasksStatus = pdFAIL;\r
+               }\r
+               xReceivedHandle = xQueueSelectFromSet( xQueueSet, queuesetDONT_BLOCK );\r
+               if( xReceivedHandle != xQueueHandle )\r
+               {\r
+                       /* Wrote to xQueueHandle so expected xQueueHandle to be the handle\r
+                       held in the queue set. */\r
+                       xQueueSetTasksStatus = pdFAIL;\r
+               }\r
+\r
+               /* Also ensure the value received from the queue is the overwritten\r
+               value, not the value originally written. */\r
+               xQueueReceive( xQueueHandle, &ulValueReceived, queuesetDONT_BLOCK );\r
+               if( ulValueReceived != ulValueToSend )\r
+               {\r
+                       /* Unexpected value recevied from the queue. */\r
+                       xQueueSetTasksStatus = pdFAIL;\r
+               }\r
+\r
+               /* Clean up. */\r
+               xQueueRemoveFromSet( xQueueHandle, xQueueSet );\r
+               vQueueDelete( xQueueHandle );\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 static void prvSetupTest( void )\r
 {\r
 BaseType_t x;\r
@@ -675,6 +748,11 @@ uint32_t ulValueToSend = 0;
                xQueueSetTasksStatus = pdFAIL;\r
        }\r
 \r
+       /* Testing the behaviour of queue sets when a queue overwrite operation is\r
+       performed on a set member requires a special test as overwrites can only\r
+       be performed on queues that have a length of 1. */\r
+       prvTestQueueOverwriteWithQueueSet();\r
+\r
        /* Resume the task that writes to the queues. */\r
        vTaskResume( xQueueSetSendingTask );\r
 \r