]> 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 96625b7f6712826a2f996a7d0b8da2a08e54b311..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"
 #endif
 
 static boolean_t initialized = FALSE;
-
-boolean_t rpp_irc1_enabled = FALSE;
-boolean_t rpp_irc2_enabled = FALSE;
+static boolean_t rpp_irc_enabled[2] = {FALSE, FALSE};
 
 int8_t rpp_irc_init()
 {
 
        if (initialized)
                return FAILURE;
+       if (!RPP_MUTEX_INIT(mutex_irc))
+               return FAILURE;
 
 #ifndef FREERTOS_POSIX
        het2Init();
@@ -55,17 +58,12 @@ int8_t rpp_irc_enable(uint8_t irc)
        if (irc < 1 || irc > 2)
                return -RPP_EINVAL;
 
-       switch (irc) {
-       case 1:
-               rpp_irc1_enabled = TRUE;
-               break;
-       case 2:
-               rpp_irc2_enabled = TRUE;
-               break;
-       }
+       RPP_MUTEX_LOCK(mutex_irc);
+       rpp_irc_enabled[irc-1] = TRUE;
 
        setMuxForIRC(irc, TRUE);
        ircEnable(irc);
+       RPP_MUTEX_UNLOCK(mutex_irc);
 
        return SUCCESS;
 }
@@ -79,13 +77,11 @@ int8_t rpp_irc_status(uint8_t irc)
        if (irc < 1 || irc > 2)
                return -RPP_EINVAL;
 
-       switch (irc) {
-       case 1:
-               return rpp_irc1_enabled ? 1 : 0;
-       case 2:
-               return rpp_irc2_enabled ? 1 : 0;
-       }
-       return FAILURE;
+       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)
@@ -101,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
@@ -119,15 +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);
-       switch (irc) {
-       case 1:
-               rpp_irc1_enabled = FALSE;
-               break;
-       case 2:
-               rpp_irc2_enabled = FALSE;
-               break;
-       }
-       return FAILURE;
+       rpp_irc_enabled[irc-1] = FALSE;
+       RPP_MUTEX_UNLOCK(mutex_irc);
+       return SUCCESS;
 }