On starting TCP server, CAReceiveHandler thread is created but it is not destroyed when it is stopped.
Though the thread stops asynchronously, its handle which is stored in the thread pool is not removed and destroyed during stop
which causes memory leak to persist till stack termination.
Note: Cherry-picked the patch from https://github.sec.samsung.net/SES/SmartThingsThing/commit/
c1d8cf83510f988fb4f8bf0e6b72cb18f618d4ec
Reviewed & Verified on current 1.2-rel codebase.
https://github.sec.samsung.net/RS7-IOTIVITY/IoTivity/commit/
ced355b7c49a76966fe4961ef93f53e470543c76
(cherry-picked from
ced355b7c49a76966fe4961ef93f53e470543c76)
Change-Id: I8eeff40b22b57cc75717f8df3e34d1fbb1388c12
Signed-off-by: Senthil Kumar G S <senthil.gs@samsung.com>
Signed-off-by: Sudipto <sudipto.bal@samsung.com>
static ca_thread_pool_t g_threadPool = NULL;
/**
static ca_thread_pool_t g_threadPool = NULL;
/**
+ * Thread task id.
+ */
+static uint32_t g_taskId = 0;
+
+/**
* Mutex to synchronize device object list.
*/
static oc_mutex g_mutexObjectList = NULL;
* Mutex to synchronize device object list.
*/
static oc_mutex g_mutexObjectList = NULL;
CAResult_t res = CA_STATUS_OK;
#ifndef __TIZENRT__
CAResult_t res = CA_STATUS_OK;
#ifndef __TIZENRT__
- res = ca_thread_pool_add_task(g_threadPool, CAReceiveHandler, NULL, NULL);
+ res = ca_thread_pool_add_task(g_threadPool, CAReceiveHandler, NULL, &g_taskId);
#else
res = ca_thread_pool_add_task(g_threadPool, CAReceiveHandler, NULL, NULL,
"IoT_TCPReceive", CONFIG_IOTIVITY_TCPRECEIVE_PTHREAD_STACKSIZE);
#else
res = ca_thread_pool_add_task(g_threadPool, CAReceiveHandler, NULL, NULL,
"IoT_TCPReceive", CONFIG_IOTIVITY_TCPRECEIVE_PTHREAD_STACKSIZE);
#endif
oc_mutex_unlock(g_mutexObjectList);
#endif
oc_mutex_unlock(g_mutexObjectList);
+#ifndef __TIZENRT__
+ ca_thread_pool_remove_task(g_threadPool, g_taskId);
+#endif
+
CATCPDisconnectAll();
sleep(1);
CATCPDisconnectAll();
sleep(1);
OIC_LOG(INFO, TAG, "Adapter terminated successfully");
}
OIC_LOG(INFO, TAG, "Adapter terminated successfully");
}