Overwrite existing QueueRegistry entries when a handle is added multiple times. (#306)

Overwrite an existing entry for a given xQueue handle when vQueueAddToRegistry is called with an xQueue handle of a queue that is already in the QueueRegistry.
diff --git a/include/queue.h b/include/queue.h
index 37ad23c..89b5fb1 100644
--- a/include/queue.h
+++ b/include/queue.h
@@ -1491,6 +1491,10 @@
  * does not effect the number of queues, semaphores and mutexes that can be
  * created - just the number that the registry can hold.
  *
+ * If vQueueAddToRegistry is called more than once with the same xQueue
+ * parameter, the registry will store the pcQueueName parameter from the
+ * most recent call to vQueueAddToRegistry.
+ *
  * @param xQueue The handle of the queue being added to the registry.  This
  * is the handle returned by a call to xQueueCreate().  Semaphore and mutex
  * handles can also be passed in here.
diff --git a/queue.c b/queue.c
index 6805cd0..2faa158 100644
--- a/queue.c
+++ b/queue.c
@@ -2730,24 +2730,37 @@
         configASSERT( xQueue );

         configASSERT( pcQueueName );

 

+        QueueRegistryItem_t * pxEntryToWrite = NULL;

+

         /* See if there is an empty space in the registry.  A NULL name denotes

          * a free slot. */

         for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )

         {

-            if( xQueueRegistry[ ux ].pcQueueName == NULL )

+            /* Replace an existing entry if the queue is already in the registry. */

+            if( xQueueRegistry[ ux ].xHandle == xQueue )

             {

-                /* Store the information on this queue. */

-                xQueueRegistry[ ux ].pcQueueName = pcQueueName;

-                xQueueRegistry[ ux ].xHandle = xQueue;

-

-                traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName );

+                pxEntryToWrite = &( xQueueRegistry[ ux ] );

                 break;

             }

+            /* Otherwise, store in the next empty location */

+            else if( ( NULL == pxEntryToWrite ) && ( xQueueRegistry[ ux ].pcQueueName == NULL ) )

+            {

+                pxEntryToWrite = &( xQueueRegistry[ ux ] );

+            }

             else

             {

                 mtCOVERAGE_TEST_MARKER();

             }

         }

+

+        if( NULL != pxEntryToWrite )

+        {

+            /* Store the information on this queue. */

+            pxEntryToWrite->pcQueueName = pcQueueName;

+            pxEntryToWrite->xHandle = xQueue;

+

+            traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName );

+        }

     }

 

 #endif /* configQUEUE_REGISTRY_SIZE */