Update snapshot(2017-11-29)
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / tcp_adapter / catcpadapter.c
index 67905f6..165e3db 100644 (file)
@@ -471,17 +471,32 @@ CAResult_t CATCPDisconnectSession(const CAEndpoint_t *endpoint)
     if (CA_STATUS_OK != res)
     {
         OIC_LOG(ERROR, TAG, "failed to close TLS session");
+        res = CAQueueingThreadClearContextData(g_sendQueueHandle,
+                                               CAClearQueueEndpointDataContext,
+                                               endpoint);
+        if (CA_STATUS_OK != res)
+        {
+            OIC_LOG(ERROR, TAG, "failed to clear context data");
+        }
+
         return res;
     }
 #endif
+
     res = CASearchAndDeleteTCPSession(endpoint);
     if (CA_STATUS_OK != res)
     {
         OIC_LOG(ERROR, TAG, "failed to close TCP session");
     }
+
     res = CAQueueingThreadClearContextData(g_sendQueueHandle,
                                            CAClearQueueEndpointDataContext,
                                            endpoint);
+    if (CA_STATUS_OK != res)
+    {
+        OIC_LOG(ERROR, TAG, "failed to clear context data");
+    }
+
     return res;
 }
 
@@ -587,7 +602,15 @@ CAResult_t CAStopTCP()
 {
     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);
@@ -595,9 +618,10 @@ CAResult_t CAStopTCP()
     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;