From f5715ac28d12735c4505c6188d25e5ee7e9b6120 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Wed, 24 Aug 2016 18:10:52 +0800 Subject: [PATCH] FreeRTOS: Add xQueueGetMutexHolder support Enables it as a config option, but there's no overhead at all if the function is not called anywhere. --- components/freertos/include/freertos/FreeRTOSConfig.h | 2 ++ components/freertos/queue.c | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/components/freertos/include/freertos/FreeRTOSConfig.h b/components/freertos/include/freertos/FreeRTOSConfig.h index 46abb9a3b8..e95abaa9cc 100644 --- a/components/freertos/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/include/freertos/FreeRTOSConfig.h @@ -222,6 +222,8 @@ #define INCLUDE_vTaskDelay 1 #define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 + /* The priority at which the tick interrupt runs. This should probably be kept at 1. */ #define configKERNEL_INTERRUPT_PRIORITY 1 diff --git a/components/freertos/queue.c b/components/freertos/queue.c index 92e182a620..248ae7c00a 100644 --- a/components/freertos/queue.c +++ b/components/freertos/queue.c @@ -483,14 +483,15 @@ int8_t *pcAllocatedBuffer; void* xQueueGetMutexHolder( QueueHandle_t xSemaphore ) { - void *pxReturn; + Queue_t * const pxQueue = ( Queue_t * ) xSemaphore; + void *pxReturn; /* This function is called by xSemaphoreGetMutexHolder(), and should not be called directly. Note: This is a good way of determining if the calling task is the mutex holder, but not a good way of determining the identity of the mutex holder, as the holder may change between the following critical section exiting and the function returning. */ - taskENTER_CRITICAL(); + taskENTER_CRITICAL(&pxQueue->mux); { if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) { @@ -501,7 +502,7 @@ int8_t *pcAllocatedBuffer; pxReturn = NULL; } } - taskEXIT_CRITICAL(); + taskEXIT_CRITICAL(&pxQueue->mux); return pxReturn; } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */