{
CAIPStopNetworkMonitor(CA_ADAPTER_TCP);
+ /* Some times send queue thread fails to terminate as it's worker
+ thread gets blocked at TCP session's socket connect operation.
+ So closing sockets which are in connect operation at the time
+ of termination of adapter would save send queue thread from
+ getting blocked. */
+ CATCPCloseInProgressConnections();
+
#ifndef SINGLE_THREAD
+ // Stop send queue thread.
if (g_sendQueueHandle && g_sendQueueHandle->threadMutex)
{
CAQueueingThreadStop(g_sendQueueHandle);
CATCPDeinitializeQueueHandles();
#endif
+ // Close TCP servers and established connections.
CATCPStopServer();
- //Re-initializing the Globals to start them again
+ // Re-initializing the Globals to start them again.
CAInitializeTCPGlobals();
return CA_STATUS_OK;
// #2. send data to remote device.
ssize_t remainLen = dlen;
+ size_t sendCounter = 0;
do
{
- size_t sendCounter = 0;
#ifdef MSG_NOSIGNAL
ssize_t len = send(sockFd, data, remainLen, MSG_DONTWAIT | MSG_NOSIGNAL);
#else
return len;
}
sendCounter++;
- OIC_LOG_V(WARNING, TAG, "send blocked. trying %zu attempt from 100", sendCounter);
- if(sendCounter >= 100)
+ OIC_LOG_V(WARNING, TAG, "send blocked. trying %zu attempt from 25", sendCounter);
+ if(sendCounter >= 25)
{
return len;
}
void CATCPDisconnectAll()
{
+ OIC_LOG(DEBUG, TAG, "IN - CATCPDisconnectAll");
+
oc_mutex_lock(g_mutexObjectList);
uint32_t length = u_arraylist_length(caglobals.tcp.svrlist);
CAcloseSslConnectionAll(CA_ADAPTER_TCP);
#endif
+ OIC_LOG(DEBUG, TAG, "OUT - CATCPDisconnectAll");
}
CATCPSessionInfo_t *CAGetTCPSessionInfoFromEndpoint(const CAEndpoint_t *endpoint, size_t *index)
return result;
}
+void CATCPCloseInProgressConnections()
+{
+ OIC_LOG(INFO, TAG, "IN - CATCPCloseInProgressConnections");
+
+ oc_mutex_lock(g_mutexObjectList);
+
+ uint32_t length = u_arraylist_length(caglobals.tcp.svrlist);
+ for (size_t index = 0; index < length; index++)
+ {
+ CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(
+ caglobals.tcp.svrlist, index);
+ if (!svritem)
+ {
+ continue;
+ }
+
+ // Session which are connecting state
+ if (svritem->fd >= 0 && svritem->state == CONNECTING)
+ {
+ shutdown(svritem->fd, SHUT_RDWR);
+ close(svritem->fd);
+ svritem->fd = -1;
+ svritem->state = DISCONNECTED;
+ }
+ }
+
+ oc_mutex_unlock(g_mutexObjectList);
+
+ OIC_LOG(INFO, TAG, "OUT - CATCPCloseInProgressConnections");
+}
+
size_t CAGetTotalLengthFromHeader(const unsigned char *recvBuffer)
{
OIC_LOG(DEBUG, TAG, "IN - CAGetTotalLengthFromHeader");