]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/event_groups.c
Notes:
[freertos] / FreeRTOS / Source / event_groups.c
index 942a34a5c354ebabbb64643bfbce532872b89554..2f4cd79915f7f07aa7bc62d77a433d31b7a82e92 100644 (file)
@@ -111,8 +111,8 @@ typedef struct xEventGroupDefinition
                UBaseType_t uxEventGroupNumber;\r
        #endif\r
 \r
-       #if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
-               uint8_t ucStaticallyAllocated;\r
+       #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r
+               uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */\r
        #endif\r
 } EventGroup_t;\r
 \r
@@ -130,49 +130,79 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
 \r
 /*-----------------------------------------------------------*/\r
 \r
-EventGroupHandle_t xEventGroupGenericCreate( StaticEventGroup_t *pxStaticEventGroup )\r
-{\r
-EventGroup_t *pxEventBits;\r
+#if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
 \r
-       if( pxStaticEventGroup == NULL )\r
-       {\r
-               /* The user has not provided a statically allocated event group, so\r
-               create on dynamically. */\r
-               pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );\r
-       }\r
-       else\r
+       EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxStaticEventGroup )\r
        {\r
+       EventGroup_t *pxEventBits;\r
+\r
+               /* A StaticEventGroup_t object must be provided. */\r
+               configASSERT( pxStaticEventGroup );\r
+\r
                /* The user has provided a statically allocated event group - use it. */\r
                pxEventBits = ( EventGroup_t * ) pxStaticEventGroup; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */\r
+\r
+               if( pxEventBits != NULL )\r
+               {\r
+                       pxEventBits->uxEventBits = 0;\r
+                       vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );\r
+\r
+                       #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r
+                       {\r
+                               /* Both static and dynamic allocation can be used, so note that\r
+                               this event group was created statically in case the event group\r
+                               is later deleted. */\r
+                               pxEventBits->ucStaticallyAllocated = pdTRUE;\r
+                       }\r
+                       #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r
+\r
+                       traceEVENT_GROUP_CREATE( pxEventBits );\r
+               }\r
+               else\r
+               {\r
+                       traceEVENT_GROUP_CREATE_FAILED();\r
+               }\r
+\r
+               return ( EventGroupHandle_t ) pxEventBits;\r
        }\r
 \r
-       if( pxEventBits != NULL )\r
+#endif /* configSUPPORT_STATIC_ALLOCATION */\r
+/*-----------------------------------------------------------*/\r
+\r
+#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r
+\r
+       EventGroupHandle_t xEventGroupCreate( void )\r
        {\r
-               pxEventBits->uxEventBits = 0;\r
-               vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );\r
+       EventGroup_t *pxEventBits;\r
+\r
+               /* Allocate the event group. */\r
+               pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );\r
 \r
-               #if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
+               if( pxEventBits != NULL )\r
                {\r
-                       if( pxStaticEventGroup == NULL )\r
+                       pxEventBits->uxEventBits = 0;\r
+                       vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );\r
+\r
+                       #if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
                        {\r
+                               /* Both static and dynamic allocation can be used, so note this\r
+                               event group was allocated statically in case the event group is\r
+                               later deleted. */\r
                                pxEventBits->ucStaticallyAllocated = pdFALSE;\r
                        }\r
-                       else\r
-                       {\r
-                               pxEventBits->ucStaticallyAllocated = pdTRUE;\r
-                       }\r
+                       #endif /* configSUPPORT_STATIC_ALLOCATION */\r
+\r
+                       traceEVENT_GROUP_CREATE( pxEventBits );\r
+               }\r
+               else\r
+               {\r
+                       traceEVENT_GROUP_CREATE_FAILED();\r
                }\r
-               #endif /* configSUPPORT_STATIC_ALLOCATION */\r
 \r
-               traceEVENT_GROUP_CREATE( pxEventBits );\r
-       }\r
-       else\r
-       {\r
-               traceEVENT_GROUP_CREATE_FAILED();\r
+               return ( EventGroupHandle_t ) pxEventBits;\r
        }\r
 \r
-       return ( EventGroupHandle_t ) pxEventBits;\r
-}\r
+#endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r
 /*-----------------------------------------------------------*/\r
 \r
 EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )\r
@@ -608,19 +638,26 @@ const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
                        ( void ) xTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET );\r
                }\r
 \r
-               /* Only free the memory if it was allocated dynamically. */\r
-               #if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
+               #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) )\r
+               {\r
+                       /* The event group can only have been allocated dynamically - free\r
+                       it again. */\r
+                       vPortFree( pxEventBits );\r
+               }\r
+               #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r
                {\r
+                       /* The event group could have been allocated statically or\r
+                       dynamically, so check before attempting to free the memory. */\r
                        if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE )\r
                        {\r
                                vPortFree( pxEventBits );\r
                        }\r
+                       else\r
+                       {\r
+                               mtCOVERAGE_TEST_MARKER();\r
+                       }\r
                }\r
-               #else\r
-               {\r
-                       vPortFree( pxEventBits );\r
-               }\r
-               #endif /* configSUPPORT_STATIC_ALLOCATION */\r
+               #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r
        }\r
        ( void ) xTaskResumeAll();\r
 }\r