You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by bp...@apache.org on 2015/01/29 20:27:58 UTC

svn commit: r1655823 - /celix/trunk/log_service/private/src/log.c

Author: bpetri
Date: Thu Jan 29 19:27:57 2015
New Revision: 1655823

URL: http://svn.apache.org/r1655823
Log:

fixed mem leak



Modified:
    celix/trunk/log_service/private/src/log.c

Modified: celix/trunk/log_service/private/src/log.c
URL: http://svn.apache.org/viewvc/celix/trunk/log_service/private/src/log.c?rev=1655823&r1=1655822&r2=1655823&view=diff
==============================================================================
--- celix/trunk/log_service/private/src/log.c (original)
+++ celix/trunk/log_service/private/src/log.c Thu Jan 29 19:27:57 2015
@@ -98,15 +98,26 @@ celix_status_t log_destroy(log_pt logger
 	celixThreadMutex_destroy(&logger->deliverLock);
 	celixThreadCondition_destroy(&logger->entriesToDeliver);
 
-	arrayList_destroy(logger->listenerEntries);
 	arrayList_destroy(logger->listeners);
 	linked_list_iterator_pt iter = linkedListIterator_create(logger->entries, 0);
 	while (linkedListIterator_hasNext(iter)) {
-	    log_entry_pt entry = linkedListIterator_next(iter);
-	    logEntry_destroy(&entry);
-	}
-	linkedListIterator_destroy(iter);
+        	log_entry_pt entry = linkedListIterator_next(iter);
+        	if (arrayList_contains(logger->listenerEntries, entry)) {
+            		arrayList_removeElement(logger->listenerEntries, entry);
+        	}
+        	logEntry_destroy(&entry);
+    	}
+    	linkedListIterator_destroy(iter);
+
+    	array_list_iterator_pt entryIter = arrayListIterator_create(logger->listenerEntries);
+
+    	while (arrayListIterator_hasNext(entryIter)) {
+        	log_entry_pt entry = arrayListIterator_next(entryIter);
+        	logEntry_destroy(&entry);
+    	}
+    	arrayListIterator_destroy(entryIter);
 
+    	arrayList_destroy(logger->listenerEntries);
 	linkedList_destroy(logger->entries);
 
 	celixThreadMutex_destroy(&logger->lock);
@@ -321,6 +332,11 @@ static void * log_listenerThread(void *d
 						}
 						arrayListIterator_destroy(it);
 
+						// destroy not-stored entries
+	                    			if (!(logger->store_debug || entry->level != OSGI_LOGSERVICE_DEBUG)) {
+	                            			logEntry_destroy(&entry);
+	                     			}
+
 						status = celixThreadMutex_unlock(&logger->listenerLock);
 						if (status != CELIX_SUCCESS) {
 							logger->running = false;