X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fcablockwisetransfer.c;h=94a642b4af99857dee0b7d2f0390cdd0c575d9d3;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=dd17fe9937dd9826558d05b08b02e14f7cf99784;hpb=edcfc3d2329da7b914771c0dcff5f42c9b74fd93;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/cablockwisetransfer.c b/resource/csdk/connectivity/src/cablockwisetransfer.c index dd17fe9..94a642b 100644 --- a/resource/csdk/connectivity/src/cablockwisetransfer.c +++ b/resource/csdk/connectivity/src/cablockwisetransfer.c @@ -41,8 +41,9 @@ #include "cablockwisetransfer.h" #include "oic_malloc.h" #include "oic_string.h" -#include "camutex.h" +#include "octhread.h" #include "logger.h" +#include "oic_time.h" #define TAG "OIC_CA_BWT" @@ -53,6 +54,9 @@ #define BLOCK_SIZE(arg) (1 << ((arg) + 4)) +#define BLOCK_DATA_TIMEOUT_SECONDS (60 * 1) // 1 minutes. +static const uint64_t USECS_PER_SEC = 1000000; + // context for block-wise transfer static CABlockWiseContext_t g_context = { .sendThreadFunc = NULL, .receivedThreadFunc = NULL, @@ -126,20 +130,20 @@ CAResult_t CAInitBlockWiseMutexVariables() { if (!g_context.blockDataListMutex) { - g_context.blockDataListMutex = ca_mutex_new(); + g_context.blockDataListMutex = oc_mutex_new(); if (!g_context.blockDataListMutex) { - OIC_LOG(ERROR, TAG, "ca_mutex_new has failed"); + OIC_LOG(ERROR, TAG, "oc_mutex_new has failed"); return CA_STATUS_FAILED; } } if (!g_context.blockDataSenderMutex) { - g_context.blockDataSenderMutex = ca_mutex_new(); + g_context.blockDataSenderMutex = oc_mutex_new(); if (!g_context.blockDataSenderMutex) { - OIC_LOG(ERROR, TAG, "ca_mutex_new has failed"); + OIC_LOG(ERROR, TAG, "oc_mutex_new has failed"); CATerminateBlockWiseMutexVariables(); return CA_STATUS_FAILED; } @@ -152,13 +156,13 @@ void CATerminateBlockWiseMutexVariables() { if (g_context.blockDataListMutex) { - ca_mutex_free(g_context.blockDataListMutex); + oc_mutex_free(g_context.blockDataListMutex); g_context.blockDataListMutex = NULL; } if (g_context.blockDataSenderMutex) { - ca_mutex_free(g_context.blockDataSenderMutex); + oc_mutex_free(g_context.blockDataSenderMutex); g_context.blockDataSenderMutex = NULL; } } @@ -266,9 +270,9 @@ CAResult_t CAAddSendThreadQueue(const CAData_t *sendData, const CABlockDataID_t if (g_context.sendThreadFunc) { - ca_mutex_lock(g_context.blockDataSenderMutex); + oc_mutex_lock(g_context.blockDataSenderMutex); g_context.sendThreadFunc(cloneData); - ca_mutex_unlock(g_context.blockDataSenderMutex); + oc_mutex_unlock(g_context.blockDataSenderMutex); } else { @@ -689,6 +693,19 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, return CA_STATUS_FAILED; } + if (!data->sentData) + { + OIC_LOG(ERROR, TAG, "data has no sent-data"); + return CA_STATUS_FAILED; + } + + CAData_t *cloneData = CACloneCAData(data->sentData); + if (!cloneData) + { + OIC_LOG(ERROR, TAG, "clone has failed"); + return CA_MEMORY_ALLOC_FAILED; + } + CAMessageType_t sentMsgType = CA_MSG_NONCONFIRM; switch (pdu->transport_hdr->udp.type) { @@ -702,53 +719,40 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, sentMsgType = CA_MSG_NONCONFIRM; } - CAData_t *cloneData = NULL; - if (data->sentData) + if (cloneData->responseInfo) + { + cloneData->responseInfo->info.messageId = pdu->transport_hdr->udp.id; + cloneData->responseInfo->info.type = sentMsgType; + cloneData->responseInfo->result = responseResult; + } + else { - cloneData = CACloneCAData(data->sentData); - if (!cloneData) + CAInfo_t responseData = { .tokenLength = pdu->transport_hdr->udp.token_length }; + responseData.token = (CAToken_t) OICMalloc(responseData.tokenLength); + if (!responseData.token) { - OIC_LOG(ERROR, TAG, "clone has failed"); + OIC_LOG(ERROR, TAG, "out of memory"); + CADestroyDataSet(cloneData); return CA_MEMORY_ALLOC_FAILED; } + memcpy(responseData.token, pdu->transport_hdr->udp.token, responseData.tokenLength); - if (cloneData->responseInfo) + cloneData->responseInfo = (CAResponseInfo_t*) OICCalloc(1, sizeof(CAResponseInfo_t)); + if (!cloneData->responseInfo) { - cloneData->responseInfo->info.messageId = pdu->transport_hdr->udp.id; - cloneData->responseInfo->info.type = sentMsgType; - cloneData->responseInfo->result = responseResult; + OIC_LOG(ERROR, TAG, "out of memory"); + CADestroyDataSet(cloneData); + OICFree(responseData.token); + return CA_MEMORY_ALLOC_FAILED; } - else - { - CAInfo_t responseData = { .tokenLength = pdu->transport_hdr->udp.token_length }; - responseData.token = (CAToken_t) OICMalloc(responseData.tokenLength); - if (!responseData.token) - { - OIC_LOG(ERROR, TAG, "out of memory"); - return CA_MEMORY_ALLOC_FAILED; - } - memcpy(responseData.token, pdu->transport_hdr->udp.token, responseData.tokenLength); - cloneData->responseInfo = (CAResponseInfo_t*) OICCalloc(1, sizeof(CAResponseInfo_t)); - if (!cloneData->responseInfo) - { - OIC_LOG(ERROR, TAG, "out of memory"); - OICFree(responseData.token); - return CA_MEMORY_ALLOC_FAILED; - } - - cloneData->responseInfo->info = responseData; - cloneData->responseInfo->info.type = sentMsgType; - cloneData->responseInfo->result = responseResult; - } - OIC_LOG(DEBUG, TAG, "set response message to send error code"); - } - else - { - OIC_LOG(ERROR, TAG, "data has no sent-data"); - return CA_MEMORY_ALLOC_FAILED; + cloneData->responseInfo->info = responseData; + cloneData->responseInfo->info.type = sentMsgType; + cloneData->responseInfo->result = responseResult; } + OIC_LOG(DEBUG, TAG, "set response message to send error code"); + // if there is a requestInfo, remove it to send response message if (cloneData->requestInfo) { @@ -759,9 +763,9 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, // add data to send thread if (g_context.sendThreadFunc) { - ca_mutex_lock(g_context.blockDataSenderMutex); + oc_mutex_lock(g_context.blockDataSenderMutex); g_context.sendThreadFunc(cloneData); - ca_mutex_unlock(g_context.blockDataSenderMutex); + oc_mutex_unlock(g_context.blockDataSenderMutex); } else { @@ -1451,20 +1455,24 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, { OIC_LOG_V(DEBUG, TAG, "[%s] opt will be added.", COAP_OPTION_DATA(*(coap_option *) opt->data)); - OIC_LOG_V(DEBUG, TAG, "[%d] pdu length", (*pdu)->length); - coap_add_option(*pdu, COAP_OPTION_KEY(*(coap_option *) opt->data), - COAP_OPTION_LENGTH(*(coap_option *) opt->data), - COAP_OPTION_DATA(*(coap_option *) opt->data)); + + if (0 == coap_add_option(*pdu, COAP_OPTION_KEY(*(coap_option *) opt->data), + COAP_OPTION_LENGTH(*(coap_option *) opt->data), + COAP_OPTION_DATA(*(coap_option *) opt->data))) + { + OIC_LOG(ERROR, TAG, "coap_add_option has failed"); + res = CA_STATUS_FAILED; + goto exit; + } } } - OIC_LOG_V(DEBUG, TAG, "[%d] pdu length after option", (*pdu)->length); // if response data is so large. it have to send as block transfer if (!coap_add_data(*pdu, dataLength, (const unsigned char *) info->payload)) { - OIC_LOG(INFO, TAG, "it have to use block"); + OIC_LOG(INFO, TAG, "it has to use block"); res = CA_STATUS_FAILED; goto exit; } @@ -1491,6 +1499,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, } } + CAResetBlockDataTTL(blockDataID); exit: CADestroyBlockID(blockDataID); OIC_LOG(DEBUG, TAG, "OUT-AddBlockOption"); @@ -2065,12 +2074,14 @@ CAData_t* CACreateNewDataSet(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint { OIC_LOG(ERROR, TAG, "memory allocation failed"); OICFree(requestData.token); + OICFree(requestInfo); return NULL; } CAGetResponseInfoFromPDU(pdu, resInfo, endpoint); requestInfo->method = CA_GET; - requestInfo->info.messageId = CAGetMessageIdFromPduBinaryData(pdu->transport_hdr, pdu->length); + requestInfo->info.messageId = CAGetMessageIdFromPduBinaryData(pdu->transport_hdr, + pdu->length); requestInfo->info.resourceUri = OICStrdup(resInfo->info.resourceUri); // after copying the resource uri, destroy response info. @@ -2081,8 +2092,17 @@ CAData_t* CACreateNewDataSet(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint if (!data) { OIC_LOG(ERROR, TAG, "out of memory"); - OICFree(requestInfo); - OICFree(responseInfo); + if (NULL != requestInfo) + { + OICFree(requestInfo->info.resourceUri); + OICFree(requestInfo->info.token); + OICFree(requestInfo); + } + if (NULL != responseInfo) + { + OICFree(responseInfo->info.token); + OICFree(responseInfo); + } return NULL; } @@ -2239,7 +2259,7 @@ CAResult_t CAUpdateBlockOptionType(const CABlockDataID_t *blockID, uint8_t block OIC_LOG(DEBUG, TAG, "IN-UpdateBlockOptionType"); VERIFY_NON_NULL(blockID, TAG, "blockID"); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2248,12 +2268,12 @@ CAResult_t CAUpdateBlockOptionType(const CABlockDataID_t *blockID, uint8_t block if (CABlockidMatches(currData, blockID)) { currData->type = blockType; - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-UpdateBlockOptionType"); return CA_STATUS_OK; } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-UpdateBlockOptionType"); return CA_STATUS_FAILED; @@ -2264,7 +2284,7 @@ uint8_t CAGetBlockOptionType(const CABlockDataID_t *blockID) OIC_LOG(DEBUG, TAG, "IN-GetBlockOptionType"); VERIFY_NON_NULL_RET(blockID, TAG, "blockID", 0); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2272,12 +2292,12 @@ uint8_t CAGetBlockOptionType(const CABlockDataID_t *blockID) CABlockData_t *currData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); if (CABlockidMatches(currData, blockID)) { - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-GetBlockOptionType"); return currData->type; } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-GetBlockOptionType"); return 0; @@ -2287,7 +2307,7 @@ CAData_t *CAGetDataSetFromBlockDataList(const CABlockDataID_t *blockID) { VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2295,11 +2315,11 @@ CAData_t *CAGetDataSetFromBlockDataList(const CABlockDataID_t *blockID) CABlockData_t *currData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); if (CABlockidMatches(currData, blockID)) { - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return currData->sentData; } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return NULL; } @@ -2310,7 +2330,7 @@ CABlockData_t *CAUpdateDataSetFromBlockDataList(const CABlockDataID_t *blockID, VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL); VERIFY_NON_NULL_RET(sendData, TAG, "sendData", NULL); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2320,11 +2340,11 @@ CABlockData_t *CAUpdateDataSetFromBlockDataList(const CABlockDataID_t *blockID, { CADestroyDataSet(currData->sentData); currData->sentData = CACloneCAData(sendData); - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return currData; } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return NULL; } @@ -2337,7 +2357,7 @@ CAResult_t CAGetTokenFromBlockDataList(const coap_pdu_t *pdu, const CAEndpoint_t VERIFY_NON_NULL(endpoint, TAG, "endpoint"); VERIFY_NON_NULL(responseInfo, TAG, "responseInfo"); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2361,13 +2381,13 @@ CAResult_t CAGetTokenFromBlockDataList(const coap_pdu_t *pdu, const CAEndpoint_t if (NULL == responseInfo->info.token) { OIC_LOG(ERROR, TAG, "out of memory"); - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return CA_MEMORY_ALLOC_FAILED; } memcpy(responseInfo->info.token, currData->sentData->requestInfo->info.token, responseInfo->info.tokenLength); - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-CAGetTokenFromBlockDataList"); return CA_STATUS_OK; } @@ -2375,7 +2395,7 @@ CAResult_t CAGetTokenFromBlockDataList(const coap_pdu_t *pdu, const CAEndpoint_t } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-CAGetTokenFromBlockDataList"); return CA_STATUS_FAILED; @@ -2417,7 +2437,7 @@ CABlockData_t *CAGetBlockDataFromBlockDataList(const CABlockDataID_t *blockID) { VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2425,11 +2445,11 @@ CABlockData_t *CAGetBlockDataFromBlockDataList(const CABlockDataID_t *blockID) CABlockData_t *currData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); if (CABlockidMatches(currData, blockID)) { - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return currData; } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return NULL; } @@ -2439,7 +2459,7 @@ coap_block_t *CAGetBlockOption(const CABlockDataID_t *blockID, uint16_t blockTyp OIC_LOG(DEBUG, TAG, "IN-GetBlockOption"); VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2447,7 +2467,7 @@ coap_block_t *CAGetBlockOption(const CABlockDataID_t *blockID, uint16_t blockTyp CABlockData_t *currData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); if (CABlockidMatches(currData, blockID)) { - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-GetBlockOption"); if (COAP_OPTION_BLOCK2 == blockType) { @@ -2459,7 +2479,7 @@ coap_block_t *CAGetBlockOption(const CABlockDataID_t *blockID, uint16_t blockTyp } } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-GetBlockOption"); return NULL; @@ -2472,7 +2492,7 @@ CAPayload_t CAGetPayloadFromBlockDataList(const CABlockDataID_t *blockID, VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL); VERIFY_NON_NULL_RET(fullPayloadLen, TAG, "fullPayloadLen", NULL); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2480,13 +2500,13 @@ CAPayload_t CAGetPayloadFromBlockDataList(const CABlockDataID_t *blockID, CABlockData_t *currData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); if (CABlockidMatches(currData, blockID)) { - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); *fullPayloadLen = currData->receivedPayloadLen; OIC_LOG(DEBUG, TAG, "OUT-GetFullPayload"); return currData->payload; } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-GetFullPayload"); return NULL; @@ -2548,8 +2568,10 @@ CABlockData_t *CACreateNewBlockData(const CAData_t *sendData) return NULL; } data->blockDataId = blockDataID; + uint64_t now = OICGetCurrentTime(TIME_IN_US); + data->ttl = now + (BLOCK_DATA_TIMEOUT_SECONDS * USECS_PER_SEC); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); bool res = u_arraylist_add(g_context.dataList, (void *) data); if (!res) @@ -2558,10 +2580,10 @@ CABlockData_t *CACreateNewBlockData(const CAData_t *sendData) CADestroyBlockID(data->blockDataId); CADestroyDataSet(data->sentData); OICFree(data); - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return NULL; } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); OIC_LOG(DEBUG, TAG, "OUT-CreateBlockData"); return data; @@ -2569,10 +2591,10 @@ CABlockData_t *CACreateNewBlockData(const CAData_t *sendData) CAResult_t CARemoveBlockDataFromList(const CABlockDataID_t *blockID) { - OIC_LOG(DEBUG, TAG, "CARemoveBlockData"); + OIC_LOG_V(DEBUG, TAG, "In %s", __func__); VERIFY_NON_NULL(blockID, TAG, "blockID"); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = 0; i < len; i++) @@ -2584,21 +2606,25 @@ CAResult_t CARemoveBlockDataFromList(const CABlockDataID_t *blockID) if (!removedData) { OIC_LOG(ERROR, TAG, "data is NULL"); - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return CA_STATUS_FAILED; } + OIC_LOG(DEBUG, TAG, "Removed BlockID is "); + OIC_LOG_BUFFER(DEBUG, TAG, (const uint8_t *) removedData->blockDataId->id, + removedData->blockDataId->idLength); + // destroy memory CADestroyDataSet(removedData->sentData); CADestroyBlockID(removedData->blockDataId); OICFree(removedData->payload); OICFree(removedData); - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return CA_STATUS_OK; } } - ca_mutex_unlock(g_context.blockDataListMutex); - + oc_mutex_unlock(g_context.blockDataListMutex); + OIC_LOG_V(DEBUG, TAG, "Out %s", __func__); return CA_STATUS_OK; } @@ -2606,7 +2632,7 @@ CAResult_t CARemoveAllBlockDataFromList() { OIC_LOG(DEBUG, TAG, "CARemoveAllBlockDataFromList"); - ca_mutex_lock(g_context.blockDataListMutex); + oc_mutex_lock(g_context.blockDataListMutex); size_t len = u_arraylist_length(g_context.dataList); for (size_t i = len; i > 0; i--) @@ -2624,7 +2650,7 @@ CAResult_t CARemoveAllBlockDataFromList() OICFree(removedData); } } - ca_mutex_unlock(g_context.blockDataListMutex); + oc_mutex_unlock(g_context.blockDataListMutex); return CA_STATUS_OK; } @@ -2743,3 +2769,57 @@ CAResult_t CARemoveBlockDataFromListWithSeed(const CAToken_t token, uint8_t toke CADestroyBlockID(blockDataID); return res; } + +void CAResetBlockDataTTL(const CABlockDataID_t *blockID) +{ + OIC_LOG_V(DEBUG, TAG, "In %s", __func__); + + oc_mutex_lock(g_context.blockDataListMutex); + size_t len = u_arraylist_length(g_context.dataList); + for (size_t i = 0; i < len; i++) + { + CABlockData_t *blockData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); + if (CABlockidMatches(blockData, blockID)) + { + uint64_t now = OICGetCurrentTime(TIME_IN_US); + blockData->ttl = now + (BLOCK_DATA_TIMEOUT_SECONDS * USECS_PER_SEC); + oc_mutex_unlock(g_context.blockDataListMutex); + OIC_LOG_V(DEBUG, TAG, "Out %s", __func__); + return; + } + } + oc_mutex_unlock(g_context.blockDataListMutex); + OIC_LOG_V(DEBUG, TAG, "Out %s", __func__); +} + +void CACheckAndDeleteTimedOutBlockData() +{ + OIC_LOG_V(DEBUG, TAG, "In %s", __func__); + + uint64_t now = OICGetCurrentTime(TIME_IN_US); + + oc_mutex_lock(g_context.blockDataListMutex); + for (size_t i = 0; i < u_arraylist_length(g_context.dataList); i++) + { + CABlockData_t *blockData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i); + if (blockData && blockData->ttl < now) + { + OIC_LOG(INFO, TAG, "Deleting timed-out BlockData"); + OIC_LOG(DEBUG, TAG, "BlockID is "); + OIC_LOG_BUFFER(DEBUG, TAG, (const uint8_t *) blockData->blockDataId->id, + blockData->blockDataId->idLength); + + blockData = (CABlockData_t *) u_arraylist_remove(g_context.dataList, i); + if (blockData) + { + // destroy memory + CADestroyDataSet(blockData->sentData); + CADestroyBlockID(blockData->blockDataId); + OICFree(blockData->payload); + OICFree(blockData); + } + } + } + oc_mutex_unlock(g_context.blockDataListMutex); + OIC_LOG_V(DEBUG, TAG, "Out %s", __func__); +}