replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / caretransmission.c
index 65d32c7..611ee5d 100644 (file)
 #define _POSIX_C_SOURCE 200809L
 #endif
 
+#ifdef __TIZENRT__
+#include <tinyara/config.h>
+#endif
+
 #include "iotivity_config.h"
 #include <stdio.h>
 #include <stdlib.h>
@@ -105,8 +109,8 @@ static const uint64_t MSECS_PER_SEC = 1000;
  */
 static uint64_t CAGetTimeoutValue()
 {
-    return ((DEFAULT_ACK_TIMEOUT_SEC * 1000) + ((1000 * OCGetRandomByte()) >> 8)) *
-            (uint64_t) 1000;
+    return ((DEFAULT_ACK_TIMEOUT_SEC * MSECS_PER_SEC)
+            + ((MSECS_PER_SEC * OCGetRandomByte()) >> 8)) * MSECS_PER_SEC;
 }
 
 CAResult_t CARetransmissionStart(CARetransmission_t *context)
@@ -122,10 +126,14 @@ CAResult_t CARetransmissionStart(CARetransmission_t *context)
         OIC_LOG(ERROR, TAG, "thread pool handle is empty..");
         return CA_STATUS_INVALID_PARAM;
     }
-
+#ifndef __TIZENRT__
     CAResult_t res = ca_thread_pool_add_task(context->threadPool, CARetransmissionBaseRoutine,
-                                             context);
-
+                                             context, NULL);
+#else
+    CAResult_t res = ca_thread_pool_add_task(context->threadPool, CARetransmissionBaseRoutine,
+                                             context, NULL, "IoT_Retransmit",
+                                             CONFIG_IOTIVITY_RETRANSMIT_PTHREAD_STACKSIZE);
+#endif
     if (CA_STATUS_OK != res)
     {
         OIC_LOG(ERROR, TAG, "thread pool add task error(send thread).");
@@ -147,17 +155,19 @@ static bool CACheckTimeout(uint64_t currentTime, CARetransmissionData_t *retData
 #ifndef SINGLE_THREAD
     // #1. calculate timeout
     uint32_t milliTimeoutValue = retData->timeout * 0.001;
-    uint64_t timeout = (milliTimeoutValue << retData->triedCount) * (uint64_t) 1000;
+    uint64_t timeout = ((uint64_t) milliTimeoutValue << retData->triedCount) * MSECS_PER_SEC;
 
     if (currentTime >= retData->timeStamp + timeout)
     {
+#ifndef __TIZENRT__
         OIC_LOG_V(DEBUG, TAG, "%" PRIu64 " microseconds time out!!, tried count(%d)",
                   timeout, retData->triedCount);
+#endif
         return true;
     }
 #else
     // #1. calculate timeout
-    uint64_t timeOut = (2 << retData->triedCount) * (uint64_t) 1000000;
+    uint64_t timeOut = (2 << retData->triedCount) * USECS_PER_SEC;
 
     if (currentTime >= retData->timeStamp + timeOut)
     {
@@ -178,7 +188,7 @@ static void CACheckRetransmissionList(CARetransmission_t *context)
     }
 
     // mutex lock
-    ca_mutex_lock(context->threadMutex);
+    oc_mutex_lock(context->threadMutex);
 
     uint32_t i = 0;
     uint32_t len = u_arraylist_length(context->dataList);
@@ -218,7 +228,7 @@ static void CACheckRetransmissionList(CARetransmission_t *context)
             {
                 OIC_LOG(ERROR, TAG, "Removed data is NULL");
                 // mutex unlock
-                ca_mutex_unlock(context->threadMutex);
+                oc_mutex_unlock(context->threadMutex);
                 return;
             }
             OIC_LOG_V(DEBUG, TAG, "max trying count, remove RTCON data,"
@@ -243,7 +253,7 @@ static void CACheckRetransmissionList(CARetransmission_t *context)
     }
 
     // mutex unlock
-    ca_mutex_unlock(context->threadMutex);
+    oc_mutex_unlock(context->threadMutex);
 }
 
 void CARetransmissionBaseRoutine(void *threadValue)
@@ -271,7 +281,7 @@ void CARetransmissionBaseRoutine(void *threadValue)
     while (!context->isStop)
     {
         // mutex lock
-        ca_mutex_lock(context->threadMutex);
+        oc_mutex_lock(context->threadMutex);
 
         if (!context->isStop && u_arraylist_length(context->dataList) <= 0)
         {
@@ -279,19 +289,21 @@ void CARetransmissionBaseRoutine(void *threadValue)
             OIC_LOG(DEBUG, TAG, "wait..there is no retransmission data.");
 
             // wait
-            ca_cond_wait(context->threadCond, context->threadMutex);
+            oc_cond_wait(context->threadCond, context->threadMutex);
 
             OIC_LOG(DEBUG, TAG, "wake up..");
         }
         else if (!context->isStop)
         {
             // check each RETRANSMISSION_CHECK_PERIOD_SEC time.
+#ifndef __TIZENRT__
             OIC_LOG_V(DEBUG, TAG, "wait..(%" PRIu64 ")microseconds",
                       RETRANSMISSION_CHECK_PERIOD_SEC * (uint64_t) USECS_PER_SEC);
+#endif
 
             // wait
             uint64_t absTime = RETRANSMISSION_CHECK_PERIOD_SEC * (uint64_t) USECS_PER_SEC;
-            ca_cond_wait_for(context->threadCond, context->threadMutex, absTime );
+            oc_cond_wait_for(context->threadCond, context->threadMutex, absTime );
         }
         else
         {
@@ -299,7 +311,7 @@ void CARetransmissionBaseRoutine(void *threadValue)
         }
 
         // mutex unlock
-        ca_mutex_unlock(context->threadMutex);
+        oc_mutex_unlock(context->threadMutex);
 
         // check stop flag
         if (context->isStop)
@@ -310,9 +322,9 @@ void CARetransmissionBaseRoutine(void *threadValue)
         CACheckRetransmissionList(context);
     }
 
-    ca_mutex_lock(context->threadMutex);
-    ca_cond_signal(context->threadCond);
-    ca_mutex_unlock(context->threadMutex);
+    oc_mutex_lock(context->threadMutex);
+    oc_cond_signal(context->threadCond);
+    oc_mutex_unlock(context->threadMutex);
 
 #endif
     OIC_LOG(DEBUG, TAG, "retransmission main thread end");
@@ -351,8 +363,8 @@ CAResult_t CARetransmissionInitialize(CARetransmission_t *context,
 
     // set send thread data
     context->threadPool = handle;
-    context->threadMutex = ca_mutex_new();
-    context->threadCond = ca_cond_new();
+    context->threadMutex = oc_mutex_new();
+    context->threadCond = oc_cond_new();
     context->dataSendMethod = retransmissionSendMethod;
     context->timeoutCallback = timeoutCallback;
     context->config = cfg;
@@ -435,7 +447,7 @@ CAResult_t CARetransmissionSentData(CARetransmission_t *context,
     retData->dataType = dataType;
 #ifndef SINGLE_THREAD
     // mutex lock
-    ca_mutex_lock(context->threadMutex);
+    oc_mutex_lock(context->threadMutex);
 
     uint32_t i = 0;
     uint32_t len = u_arraylist_length(context->dataList);
@@ -457,7 +469,7 @@ CAResult_t CARetransmissionSentData(CARetransmission_t *context,
             OIC_LOG(ERROR, TAG, "Duplicate message ID");
 
             // mutex unlock
-            ca_mutex_unlock(context->threadMutex);
+            oc_mutex_unlock(context->threadMutex);
 
             OICFree(retData);
             OICFree(pduData);
@@ -466,16 +478,38 @@ CAResult_t CARetransmissionSentData(CARetransmission_t *context,
         }
     }
 
-    u_arraylist_add(context->dataList, (void *) retData);
+    bool res = u_arraylist_add(context->dataList, (void *) retData);
+    if (!res)
+    {
+        OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
+
+        oc_mutex_unlock(context->threadMutex);
+
+        OICFree(retData);
+        OICFree(pduData);
+        OICFree(remoteEndpoint);
+        return CA_MEMORY_ALLOC_FAILED;
+    }
 
     // notify the thread
-    ca_cond_signal(context->threadCond);
+    oc_cond_signal(context->threadCond);
 
     // mutex unlock
-    ca_mutex_unlock(context->threadMutex);
+    oc_mutex_unlock(context->threadMutex);
 
 #else
-    u_arraylist_add(context->dataList, (void *) retData);
+    bool res = u_arraylist_add(context->dataList, (void *) retData);
+    if (!res)
+    {
+        OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
+
+        oc_mutex_unlock(context->threadMutex);
+
+        OICFree(retData);
+        OICFree(pduData);
+        OICFree(remoteEndpoint);
+        return CA_MEMORY_ALLOC_FAILED;
+    }
 
     CACheckRetransmissionList(context);
 #endif
@@ -516,7 +550,7 @@ CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
     }
 
     // mutex lock
-    ca_mutex_lock(context->threadMutex);
+    oc_mutex_lock(context->threadMutex);
     uint32_t len = u_arraylist_length(context->dataList);
 
     // find index
@@ -546,7 +580,7 @@ CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
                     OIC_LOG(ERROR, TAG, "retData->pdu is null");
                     OICFree(retData);
                     // mutex unlock
-                    ca_mutex_unlock(context->threadMutex);
+                    oc_mutex_unlock(context->threadMutex);
 
                     return CA_STATUS_FAILED;
                 }
@@ -559,7 +593,7 @@ CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
                     OIC_LOG(ERROR, TAG, "memory error");
 
                     // mutex unlock
-                    ca_mutex_unlock(context->threadMutex);
+                    oc_mutex_unlock(context->threadMutex);
 
                     return CA_MEMORY_ALLOC_FAILED;
                 }
@@ -573,7 +607,7 @@ CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
                 OIC_LOG(ERROR, TAG, "Removed data is NULL");
 
                 // mutex unlock
-                ca_mutex_unlock(context->threadMutex);
+                oc_mutex_unlock(context->threadMutex);
 
                 return CA_STATUS_FAILED;
             }
@@ -589,12 +623,51 @@ CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
     }
 
     // mutex unlock
-    ca_mutex_unlock(context->threadMutex);
+    oc_mutex_unlock(context->threadMutex);
 
     OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
 
+CAResult_t CARetransmissionClearAdapterData(CARetransmission_t *context, CATransportAdapter_t type)
+{
+    if (NULL == context)
+    {
+        OIC_LOG(ERROR, TAG, "thread instance is empty..");
+        return CA_STATUS_INVALID_PARAM;
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "clear queue data for Adapter : %d ", type);
+
+    // mutex lock
+    oc_mutex_lock(context->threadMutex);
+
+    uint32_t len = u_arraylist_length(context->dataList);
+
+    // find index
+    uint32_t i;
+    for (i = 0; i < len; i++)
+    {
+        // get data
+        CARetransmissionData_t *removedData = (CARetransmissionData_t *) u_arraylist_get(
+            context->dataList, i);
+
+        // free
+        if (NULL != removedData && NULL != removedData->endpoint &&
+                removedData->endpoint->adapter == type)
+        {
+            CAFreeEndpoint(removedData->endpoint);
+            OICFree(removedData->pdu);
+            OICFree(removedData);
+        }
+    }
+
+    // mutex unlock
+    oc_mutex_unlock(context->threadMutex);
+
+    return CA_STATUS_OK;
+}
+
 CAResult_t CARetransmissionStop(CARetransmission_t *context)
 {
     if (NULL == context)
@@ -606,18 +679,18 @@ CAResult_t CARetransmissionStop(CARetransmission_t *context)
     OIC_LOG(DEBUG, TAG, "retransmission stop request!!");
 
     // mutex lock
-    ca_mutex_lock(context->threadMutex);
+    oc_mutex_lock(context->threadMutex);
 
     // set stop flag
     context->isStop = true;
 
     // notify the thread
-    ca_cond_signal(context->threadCond);
+    oc_cond_signal(context->threadCond);
 
-    ca_cond_wait(context->threadCond, context->threadMutex);
+    oc_cond_wait(context->threadCond, context->threadMutex);
 
     // mutex unlock
-    ca_mutex_unlock(context->threadMutex);
+    oc_mutex_unlock(context->threadMutex);
 
     return CA_STATUS_OK;
 }
@@ -632,22 +705,9 @@ CAResult_t CARetransmissionDestroy(CARetransmission_t *context)
 
     OIC_LOG(DEBUG, TAG, "retransmission context destroy..");
 
-    ca_mutex_lock(context->threadMutex);
-    uint32_t len = u_arraylist_length(context->dataList);
-    for (uint32_t i = 0; i < len; i++)
-    {
-        CARetransmissionData_t *data = u_arraylist_get(context->dataList, i);
-        if (NULL == data)
-        {
-            continue;
-        }
-        CAFreeEndpoint(data->endpoint);
-        OICFree(data->pdu);
-    }
-    ca_mutex_unlock(context->threadMutex);
-    ca_mutex_free(context->threadMutex);
+    oc_mutex_free(context->threadMutex);
     context->threadMutex = NULL;
-    ca_cond_free(context->threadCond);
+    oc_cond_free(context->threadCond);
     u_arraylist_free(&context->dataList);
 
     return CA_STATUS_OK;