]> rtime.felk.cvut.cz Git - pes-rpp/rpp-lib.git/blobdiff - rpp/src/rpp/irc.c
Make the RPP layer thread safe
[pes-rpp/rpp-lib.git] / rpp / src / rpp / irc.c
index 5002922684f799ca392d4bbb2b51fab4cebe2aeb..6886744dd76f52ed66bf4e9e4db4a3128f67f5f5 100644 (file)
@@ -18,6 +18,9 @@
  */
 
 #include "rpp/rpp.h"
+#include "rpp/mutex.h"
+
+RPP_MUTEX_DEFINE(mutex_irc);
 
 #ifndef FREERTOS_POSIX
 #include "sys/sys.h"
@@ -28,7 +31,6 @@
 #endif
 
 static boolean_t initialized = FALSE;
-
 static boolean_t rpp_irc_enabled[2] = {FALSE, FALSE};
 
 int8_t rpp_irc_init()
@@ -36,6 +38,8 @@ int8_t rpp_irc_init()
 
        if (initialized)
                return FAILURE;
+       if (!RPP_MUTEX_INIT(mutex_irc))
+               return FAILURE;
 
 #ifndef FREERTOS_POSIX
        het2Init();
@@ -54,10 +58,12 @@ int8_t rpp_irc_enable(uint8_t irc)
        if (irc < 1 || irc > 2)
                return -RPP_EINVAL;
 
+       RPP_MUTEX_LOCK(mutex_irc);
        rpp_irc_enabled[irc-1] = TRUE;
 
        setMuxForIRC(irc, TRUE);
        ircEnable(irc);
+       RPP_MUTEX_UNLOCK(mutex_irc);
 
        return SUCCESS;
 }
@@ -71,7 +77,11 @@ int8_t rpp_irc_status(uint8_t irc)
        if (irc < 1 || irc > 2)
                return -RPP_EINVAL;
 
-       return rpp_irc_enabled[irc-1];
+       RPP_MUTEX_LOCK(mutex_irc);
+       boolean_t ret_val = rpp_irc_enabled[irc-1];
+       RPP_MUTEX_UNLOCK(mutex_irc);
+
+       return ret_val;
 }
 
 int32_t rpp_irc_get(uint8_t irc)
@@ -87,7 +97,10 @@ int32_t rpp_irc_get(uint8_t irc)
                return FAILURE;
 
 #ifndef FREERTOS_POSIX
-       return ircGet(irc);
+       RPP_MUTEX_LOCK(mutex_irc);
+       int32_t ret_val = ircGet(irc);
+       RPP_MUTEX_UNLOCK(mutex_irc);
+       return ret_val;
 #else
        return 1;
 #endif
@@ -105,8 +118,10 @@ int8_t rpp_irc_disable(uint8_t irc)
        if (rpp_irc_status(irc) != 1)
                return FAILURE;
 
+       RPP_MUTEX_LOCK(mutex_irc);
        ircDisable(irc);
        setMuxForIRC(irc, FALSE);
        rpp_irc_enabled[irc-1] = FALSE;
+       RPP_MUTEX_UNLOCK(mutex_irc);
        return SUCCESS;
 }