]> git.sur5r.net Git - freertos/commitdiff
Added xSemaphoreGetMutexHolder() macro and equivalent function.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 11 Mar 2012 15:23:51 +0000 (15:23 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 11 Mar 2012 15:23:51 +0000 (15:23 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1688 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Source/include/queue.h
Source/include/semphr.h
Source/queue.c

index d129f64cd483bf21ab566147ea4e2ec2a8bfcaa1..81f46cf98f92e8c288d101efb8fe5770306da24d 100644 (file)
@@ -56,7 +56,7 @@
 #define QUEUE_H\r
 \r
 #ifndef INC_FREERTOS_H\r
-       #error "#include FreeRTOS.h" must appear in source files before "#include queue.h"\r
+       #error "include FreeRTOS.h" must appear in source files before "include queue.h"\r
 #endif\r
 \r
 #ifdef __cplusplus\r
@@ -1221,11 +1221,13 @@ signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQue
 signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );\r
 \r
 /*\r
- * For internal use only.  Use xSemaphoreCreateMutex() or\r
- * xSemaphoreCreateCounting() instead of calling these functions directly.\r
+ * For internal use only.  Use xSemaphoreCreateMutex(), \r
+ * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling \r
+ * these functions directly.\r
  */\r
 xQueueHandle xQueueCreateMutex( unsigned char ucQueueType );\r
 xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );\r
+void* xQueueGetMutexHolder( xQueueHandle xSemaphore );\r
 \r
 /*\r
  * For internal use only.  Use xSemaphoreTakeMutexRecursive() or\r
index 251e73809687c6679551f899f8addf4c29cc2770..98f3b4fcd1e24338843db529ae9974367d286232 100644 (file)
@@ -55,7 +55,7 @@
 #define SEMAPHORE_H\r
 \r
 #ifndef INC_FREERTOS_H\r
-       #error "#include FreeRTOS.h" must appear in source files before "#include semphr.h"\r
+       #error "include FreeRTOS.h" must appear in source files before "include semphr.h"\r
 #endif\r
 \r
 #include "queue.h"\r
@@ -718,7 +718,22 @@ typedef xQueueHandle xSemaphoreHandle;
  * \page vSemaphoreDelete vSemaphoreDelete\r
  * \ingroup Semaphores\r
  */\r
-#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) xSemaphore )\r
+#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) ( xSemaphore ) )\r
+\r
+/**\r
+ * semphr.h\r
+ * <pre>xTaskHandle xSemaphoreGetMutexHolder( xSemaphoreHandle xMutex );</pre>\r
+ *\r
+ * If xMutex is indeed a mutex type semaphore, return the current mutex holder.\r
+ * If xMutex is not a mutex type semaphore, or the mutex is available (not held\r
+ * by a task), return NULL.\r
+ *\r
+ * Note: This Is is a good way of determining if the calling task is the mutex \r
+ * holder, but not a good way of determining the identity of the mutex holder as\r
+ * the holder may change between the function exiting and the returned value\r
+ * being tested.\r
+ */\r
+#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) )\r
 \r
 #endif /* SEMAPHORE_H */\r
 \r
index 19c51d759c68901338649b096fb95a5500ea39ac..0eb8d2bddfb1bcf7f39594e5b0490f4c612dcb8b 100644 (file)
@@ -164,6 +164,7 @@ unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;
 void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION;\r
 unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;\r
 portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue ) PRIVILEGED_FUNCTION;\r
+xTaskHandle xQueueGetMutexHolder( xQueueHandle xSemaphore ) PRIVILEGED_FUNCTION;\r
 \r
 /*\r
  * Co-routine queue functions differ from task queue functions.  Co-routines are\r
@@ -307,7 +308,7 @@ xQUEUE *pxNewQueue;
 size_t xQueueSizeInBytes;\r
 xQueueHandle xReturn = NULL;\r
 \r
-       /* Remove compiler warnings about unused parameters should \r
+       /* Remove compiler warnings about unused parameters should\r
        configUSE_TRACE_FACILITY not be set to 1. */\r
        ( void ) ucQueueType;\r
 \r
@@ -361,7 +362,7 @@ xQueueHandle xReturn = NULL;
                /* Prevent compiler warnings about unused parameters if\r
                configUSE_TRACE_FACILITY does not equal 1. */\r
                ( void ) ucQueueType;\r
-       \r
+\r
                /* Allocate the new queue structure. */\r
                pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) );\r
                if( pxNewQueue != NULL )\r
@@ -383,7 +384,7 @@ xQueueHandle xReturn = NULL;
                        pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U;\r
                        pxNewQueue->xRxLock = queueUNLOCKED;\r
                        pxNewQueue->xTxLock = queueUNLOCKED;\r
-                       \r
+\r
                        #if ( configUSE_TRACE_FACILITY == 1 )\r
                        {\r
                                pxNewQueue->ucQueueType = ucQueueType;\r
@@ -411,7 +412,37 @@ xQueueHandle xReturn = NULL;
 #endif /* configUSE_MUTEXES */\r
 /*-----------------------------------------------------------*/\r
 \r
-#if configUSE_RECURSIVE_MUTEXES == 1\r
+#if ( configUSE_MUTEXES == 1 )\r
+\r
+       void* xQueueGetMutexHolder( xQueueHandle xSemaphore )\r
+       {\r
+       void *pxReturn;\r
+\r
+               /* This function is called by xSemaphoreGetMutexHolder(), and should not\r
+               be called directly.  Note:  This is is a good way of determining if the\r
+               calling task is the mutex holder, but not a good way of determining the\r
+               identity of the mutex holder, as the holder may change between the \r
+               following critical section exiting and the function returning. */\r
+               taskENTER_CRITICAL();\r
+               {\r
+                       if( xSemaphore->uxQueueType == queueQUEUE_IS_MUTEX )\r
+                       {\r
+                               pxReturn = ( void * ) xSemaphore->pxMutexHolder;\r
+                       }\r
+                       else\r
+                       {\r
+                               pxReturn = NULL;\r
+                       }\r
+               }\r
+               taskEXIT_CRITICAL();\r
+               \r
+               return pxReturn;\r
+       }\r
+\r
+#endif\r
+/*-----------------------------------------------------------*/\r
+\r
+#if ( configUSE_RECURSIVE_MUTEXES == 1 )\r
 \r
        portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex )\r
        {\r