Fix memory leak at thread termination.
authorKIM JungYong <jyong2.kim@samsung.com>
Tue, 9 Aug 2016 07:17:11 +0000 (16:17 +0900)
committerMadan Lanka <lanka.madan@samsung.com>
Wed, 10 Aug 2016 04:23:46 +0000 (04:23 +0000)
When push thread done one's works, thread handle does not deallocated.
So, push thread was detached from consumer thread,
and allocated push thread handle was deallocated.

This issue was found on valgrind.

Change-Id: Ia99f960adc8131f2f97f99aa455c19a021abf70f
Signed-off-by: KIM JungYong <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10187
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
service/notification/src/consumer/NSConsumerScheduler.c
service/notification/src/consumer/NSThread.c
service/notification/src/consumer/NSThread.h

index 4716ddd..7419aca 100644 (file)
@@ -110,6 +110,8 @@ NSResult NSConsumerPushEvent(NSTask * task)
     NSConsumerThread * thread = NSThreadInit(NSConsumerMsgPushThreadFunc, (void *) task);
     NS_VERIFY_NOT_NULL(thread, NS_ERROR);
 
+    NSDestroyThreadHandle(thread);
+
     return NS_OK;
 }
 
@@ -174,16 +176,18 @@ void * NSConsumerMsgHandleThreadFunc(void * threadHandle)
 
 void * NSConsumerMsgPushThreadFunc(void * data)
 {
+    NSThreadDetach();
+
     NSConsumerQueueObject * obj = NULL;
     NSConsumerQueue * queue = NULL;
 
     NS_LOG(DEBUG, "get queueThread handle");
     NSConsumerThread * msgHandleThread = *(NSGetMsgHandleThreadHandle());
-    NS_VERIFY_NOT_NULL(msgHandleThread, NULL);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(msgHandleThread, NULL, NSOICFree(data));
 
     NS_LOG(DEBUG, "create queue object");
     obj = (NSConsumerQueueObject *)OICMalloc(sizeof(NSConsumerQueueObject));
-    NS_VERIFY_NOT_NULL(obj, NULL);
+    NS_VERIFY_NOT_NULL_WITH_POST_CLEANING(obj, NULL, NSOICFree(data));
 
     obj->data = data;
     obj->next = NULL;
index adda254..8490acd 100644 (file)
@@ -28,8 +28,6 @@
 
 static pthread_mutex_t g_create_mutex;
 
-void NSDestroyThreadHandle(NSConsumerThread *);
-
 NSConsumerThread * NSThreadInit(NSThreadFunc func, void * data)
 {
     NS_VERIFY_NOT_NULL(func, NULL);
@@ -77,6 +75,9 @@ void NSThreadUnlock(NSConsumerThread * handle)
 
 void NSThreadStop(NSConsumerThread * handle)
 {
+    handle->isStarted = false;
+    NSThreadJoin(handle);
+
     NSDestroyThreadHandle(handle);
 }
 
@@ -90,10 +91,6 @@ void NSThreadJoin(NSConsumerThread * handle)
 
 void NSDestroyThreadHandle(NSConsumerThread * handle)
 {
-    handle->isStarted = false;
-
-    NSThreadJoin(handle);
-
     pthread_mutex_destroy(&(handle->mutex));
     pthread_mutexattr_destroy(&(handle->mutex_attr));
 
@@ -102,3 +99,7 @@ void NSDestroyThreadHandle(NSConsumerThread * handle)
     pthread_mutex_unlock(&g_create_mutex);
 }
 
+void NSThreadDetach()
+{
+    pthread_detach(pthread_self());
+}
index 1e1d7bb..a78fb5a 100644 (file)
@@ -59,6 +59,10 @@ void NSThreadJoin(NSConsumerThread *);
 
 void NSThreadStop(NSConsumerThread *);
 
+void NSDestroyThreadHandle(NSConsumerThread *);
+
+void NSThreadDetach();
+
 #ifdef __cplusplus
 }
 #endif // __cplusplus