]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/Reliance-Edge/os/freertos/services/osmutex.c
Update version of Reliance Edge.
[freertos] / FreeRTOS-Plus / Source / Reliance-Edge / os / freertos / services / osmutex.c
index 0bc2c701b11e07e8b8179170860eaf0ca0e2f56f..68cd0eda0f4b6dea4d613a4b1a62e1ee7477fc99 100644 (file)
-/*             ----> DO NOT REMOVE THE FOLLOWING NOTICE <----\r
-\r
-                   Copyright (c) 2014-2015 Datalight, Inc.\r
-                       All Rights Reserved Worldwide.\r
-\r
-    This program is free software; you can redistribute it and/or modify\r
-    it under the terms of the GNU General Public License as published by\r
-    the Free Software Foundation; use version 2 of the License.\r
-\r
-    This program is distributed in the hope that it will be useful,\r
-    but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty\r
-    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-    GNU General Public License for more details.\r
-\r
-    You should have received a copy of the GNU General Public License along\r
-    with this program; if not, write to the Free Software Foundation, Inc.,\r
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
-*/\r
-/*  Businesses and individuals that for commercial or other reasons cannot\r
-    comply with the terms of the GPLv2 license may obtain a commercial license\r
-    before incorporating Reliance Edge into proprietary software for\r
-    distribution in any form.  Visit http://www.datalight.com/reliance-edge for\r
-    more information.\r
-*/\r
-/** @file\r
-    @brief Implements a synchronization object to provide mutual exclusion.\r
-*/\r
-#include <FreeRTOS.h>\r
-#include <semphr.h>\r
-\r
-#include <redfs.h>\r
-\r
-#if REDCONF_TASK_COUNT > 1U\r
-\r
-\r
-static SemaphoreHandle_t xMutex;\r
-\r
-\r
-/** @brief Initialize the mutex.\r
-\r
-    After initialization, the mutex is in the released state.\r
-\r
-    The behavior of calling this function when the mutex is still initialized\r
-    is undefined.\r
-\r
-    @return A negated ::REDSTATUS code indicating the operation result.\r
-\r
-    @retval 0   Operation was successful.\r
-*/\r
-REDSTATUS RedOsMutexInit(void)\r
-{\r
-    REDSTATUS ret;\r
-\r
-    xMutex = xSemaphoreCreateMutex();\r
-    if(xMutex != NULL)\r
-    {\r
-        ret = 0;\r
-    }\r
-    else\r
-    {\r
-        ret = -RED_ENOMEM;\r
-    }\r
-\r
-    return ret;\r
-}\r
-\r
-\r
-/** @brief Uninitialize the mutex.\r
-\r
-    The behavior of calling this function when the mutex is not initialized is\r
-    undefined; likewise, the behavior of uninitializing the mutex when it is\r
-    in the acquired state is undefined.\r
-\r
-    @return A negated ::REDSTATUS code indicating the operation result.\r
-\r
-    @retval 0   Operation was successful.\r
-*/\r
-REDSTATUS RedOsMutexUninit(void)\r
-{\r
-    vSemaphoreDelete(xMutex);\r
-    xMutex = NULL;\r
-\r
-    return 0;\r
-}\r
-\r
-\r
-/** @brief Acquire the mutex.\r
-\r
-    The behavior of calling this function when the mutex is not initialized is\r
-    undefined; likewise, the behavior of recursively acquiring the mutex is\r
-    undefined.\r
-*/\r
-void RedOsMutexAcquire(void)\r
-{\r
-    while(xSemaphoreTake(xMutex, portMAX_DELAY) != pdTRUE)\r
-    {\r
-    }\r
-}\r
-\r
-\r
-/** @brief Release the mutex.\r
-\r
-    The behavior is undefined in the following cases:\r
-\r
-    - Releasing the mutex when the mutex is not initialized.\r
-    - Releasing the mutex when it is not in the acquired state.\r
-    - Releasing the mutex from a task or thread other than the one which\r
-      acquired the mutex.\r
-*/\r
-void RedOsMutexRelease(void)\r
-{\r
-    BaseType_t xSuccess;\r
-\r
-    xSuccess = xSemaphoreGive(xMutex);\r
-    REDASSERT(xSuccess == pdTRUE);\r
-    (void)xSuccess;\r
-}\r
-\r
-#endif\r
-\r
+/*             ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
+
+                   Copyright (c) 2014-2015 Datalight, Inc.
+                       All Rights Reserved Worldwide.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; use version 2 of the License.
+
+    This program is distributed in the hope that it will be useful,
+    but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
+    of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+/*  Businesses and individuals that for commercial or other reasons cannot
+    comply with the terms of the GPLv2 license may obtain a commercial license
+    before incorporating Reliance Edge into proprietary software for
+    distribution in any form.  Visit http://www.datalight.com/reliance-edge for
+    more information.
+*/
+/** @file
+    @brief Implements a synchronization object to provide mutual exclusion.
+*/
+#include <FreeRTOS.h>
+#include <semphr.h>
+
+#include <redfs.h>
+#include <redosdeviations.h>
+
+#if REDCONF_TASK_COUNT > 1U
+
+
+static SemaphoreHandle_t xMutex;
+#if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1)
+static StaticSemaphore_t xMutexBuffer;
+#endif
+
+
+/** @brief Initialize the mutex.
+
+    After initialization, the mutex is in the released state.
+
+    The behavior of calling this function when the mutex is still initialized
+    is undefined.
+
+    @return A negated ::REDSTATUS code indicating the operation result.
+
+    @retval 0   Operation was successful.
+*/
+REDSTATUS RedOsMutexInit(void)
+{
+    REDSTATUS ret = 0;
+    
+  #if defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION == 1)
+    xMutex = xSemaphoreCreateMutexStatic(&xMutexBuffer);
+    
+    if(xMutex == NULL)
+    {
+        /*  The only error case for xSemaphoreCreateMutexStatic is that the mutex
+            buffer parameter is NULL, which is not the case.
+        */
+        REDERROR();
+        ret = -RED_EINVAL;
+    }        
+    
+  #else
+    xMutex = xSemaphoreCreateMutex();
+    if(xMutex == NULL)
+    {
+        ret = -RED_ENOMEM;
+    }
+  #endif
+
+    return ret;
+}
+
+
+/** @brief Uninitialize the mutex.
+
+    The behavior of calling this function when the mutex is not initialized is
+    undefined; likewise, the behavior of uninitializing the mutex when it is
+    in the acquired state is undefined.
+
+    @return A negated ::REDSTATUS code indicating the operation result.
+
+    @retval 0   Operation was successful.
+*/
+REDSTATUS RedOsMutexUninit(void)
+{
+    vSemaphoreDelete(xMutex);
+    xMutex = NULL;
+
+    return 0;
+}
+
+
+/** @brief Acquire the mutex.
+
+    The behavior of calling this function when the mutex is not initialized is
+    undefined; likewise, the behavior of recursively acquiring the mutex is
+    undefined.
+*/
+void RedOsMutexAcquire(void)
+{
+    while(xSemaphoreTake(xMutex, portMAX_DELAY) != pdTRUE)
+    {
+    }
+}
+
+
+/** @brief Release the mutex.
+
+    The behavior is undefined in the following cases:
+
+    - Releasing the mutex when the mutex is not initialized.
+    - Releasing the mutex when it is not in the acquired state.
+    - Releasing the mutex from a task or thread other than the one which
+      acquired the mutex.
+*/
+void RedOsMutexRelease(void)
+{
+    BaseType_t xSuccess;
+
+    xSuccess = xSemaphoreGive(xMutex);
+    REDASSERT(xSuccess == pdTRUE);
+    IGNORE_ERRORS(xSuccess);
+}
+
+#endif
+