X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fcaretransmission.c;h=611ee5d4e75879f796800eaa1ef35c95aeae9095;hb=3c093548382bb2542c87a67e6e5fa32552c29cb3;hp=65d32c71e0ee817942cfceebe679dcefa24a7529;hpb=edcfc3d2329da7b914771c0dcff5f42c9b74fd93;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/caretransmission.c b/resource/csdk/connectivity/src/caretransmission.c index 65d32c7..611ee5d 100644 --- a/resource/csdk/connectivity/src/caretransmission.c +++ b/resource/csdk/connectivity/src/caretransmission.c @@ -41,6 +41,10 @@ #define _POSIX_C_SOURCE 200809L #endif +#ifdef __TIZENRT__ +#include +#endif + #include "iotivity_config.h" #include #include @@ -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;