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/11/24 19:26:58 UTC

celix git commit: CELIX-305: Memory leaks in RSA_SHM, RSA_DFI, RSA_HTTP

Repository: celix
Updated Branches:
  refs/heads/develop d3c783c98 -> 52528fdc3


CELIX-305: Memory leaks in RSA_SHM, RSA_DFI, RSA_HTTP


Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/52528fdc
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/52528fdc
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/52528fdc

Branch: refs/heads/develop
Commit: 52528fdc30a80211ae2babf5247bf1250881dfe5
Parents: d3c783c
Author: Bjoern Petri <bp...@apache.org>
Authored: Tue Nov 24 19:25:01 2015 +0100
Committer: Bjoern Petri <bp...@apache.org>
Committed: Tue Nov 24 19:25:01 2015 +0100

----------------------------------------------------------------------
 .../rsa/private/src/import_registration_dfi.c    |  5 ++++-
 .../rsa/private/src/remote_service_admin_dfi.c   | 16 +++++++++++++---
 .../rsa_tst/rsa_client_server_tests.cpp          | 19 ++++++++++++-------
 .../rsa_tst/rsa_tests.cpp                        |  7 +++++++
 .../private/src/remote_service_admin_impl.c      | 12 ++++++++----
 .../private/test/rsa_client_server_tests.cpp     | 10 ++++++++--
 .../private/src/remote_service_admin_impl.c      | 16 ++++++++++++++--
 .../private/test/rsa_client_server_tests.cpp     | 15 +++++++++++----
 .../private/src/topology_manager.c               |  4 ++++
 9 files changed, 81 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c b/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
index 99c49b6..813d75f 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
+++ b/remote_services/remote_service_admin_dfi/rsa/private/src/import_registration_dfi.c
@@ -188,7 +188,7 @@ celix_status_t importRegistration_getService(import_registration_pt import, bund
 }
 
 static celix_status_t importRegistration_createProxy(import_registration_pt import, bundle_pt bundle, struct service_proxy **out) {
-    celix_status_t  status = CELIX_SUCCESS;
+    celix_status_t  status;
 
     char *descriptorFile = NULL;
     char name[128];
@@ -299,6 +299,9 @@ static void importRegistration_proxyFunc(void *userData, void *args[], void *ret
         }
 
         *(int *) returnVal = rc;
+
+        free(invokeRequest); //Allocated by json_dumps in jsonRpc_prepareInvokeRequest
+        free(reply); //Allocated by json_dumps in remoteServiceAdmin_send through curl call
     }
 
     if (status != CELIX_SUCCESS) {

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c b/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
index 67f6b30..a51795b 100644
--- a/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
+++ b/remote_services/remote_service_admin_dfi/rsa/private/src/remote_service_admin_dfi.c
@@ -247,8 +247,10 @@ celix_status_t remoteServiceAdmin_stop(remote_service_admin_pt admin) {
             export_registration_pt export = arrayList_get(exports, i);
             if (export != NULL) {
                 exportRegistration_stop(export);
+                exportRegistration_destroy(export);
             }
         }
+        arrayList_destroy(exports);
     }
     hashMapIterator_destroy(iter);
     celixThreadMutex_unlock(&admin->exportedServicesLock);
@@ -260,6 +262,7 @@ celix_status_t remoteServiceAdmin_stop(remote_service_admin_pt admin) {
         import_registration_pt import = arrayList_get(admin->importedServices, i);
         if (import != NULL) {
             importRegistration_stop(import);
+            importRegistration_destroy(import);
         }
     }
     celixThreadMutex_unlock(&admin->importedServicesLock);
@@ -371,7 +374,7 @@ static int remoteServiceAdmin_callback(struct mg_connection *conn) {
 }
 
 celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations) {
-    celix_status_t status = CELIX_SUCCESS;
+    celix_status_t status;
 
     arrayList_create(registrations);
     array_list_pt references = NULL;
@@ -436,12 +439,16 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
         hashMap_put(admin->exportedServices, reference, *registrations);
         celixThreadMutex_unlock(&admin->exportedServicesLock);
     }
+    else{
+    	arrayList_destroy(*registrations);
+    	*registrations = NULL;
+    }
 
     return status;
 }
 
 celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration) {
-    celix_status_t status = CELIX_SUCCESS;
+    celix_status_t status;
 
     logHelper_log(admin->loghelper, OSGI_LOGSERVICE_INFO, "RSA_DFI: Removing exported service");
 
@@ -453,7 +460,10 @@ celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt
         celixThreadMutex_lock(&admin->exportedServicesLock);
     	exportReference_getExportedService(ref, &servRef);
 
-    	hashMap_remove(admin->exportedServices, servRef);
+    	array_list_pt exports = (array_list_pt)hashMap_remove(admin->exportedServices, servRef);
+    	if(exports!=NULL){
+    		arrayList_destroy(exports);
+    	}
 
         exportRegistration_close(registration);
         exportRegistration_destroy(registration);

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_dfi/rsa_tst/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa_tst/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_dfi/rsa_tst/rsa_client_server_tests.cpp
index b4775f7..d091746 100644
--- a/remote_services/remote_service_admin_dfi/rsa_tst/rsa_client_server_tests.cpp
+++ b/remote_services/remote_service_admin_dfi/rsa_tst/rsa_client_server_tests.cpp
@@ -88,22 +88,27 @@ extern "C" {
     }
 
     static void test1(void) {
-        int rc = 0;
+        celix_status_t rc;
         service_reference_pt ref = NULL;
         tst_service_pt tst = NULL;
+        int retries = 4;
 
-        usleep(2000000); //TODO use tracker
+        while (ref == NULL && retries > 0) {
+            printf("Waiting for service .. %d\n", retries);
+            rc = bundleContext_getServiceReference(clientContext, (char *) TST_SERVICE_NAME, &ref);
+            usleep(1000000);
+            --retries;
+        }
 
-        bundleContext_getServiceReference(clientContext, (char *)TST_SERVICE_NAME, &ref);
-        CHECK_EQUAL(0, rc);
+        CHECK_EQUAL(CELIX_SUCCESS, rc);
         CHECK(ref != NULL);
 
-        bundleContext_getService(clientContext, ref, (void **)&tst);
-        CHECK_EQUAL(0, rc);
+        rc = bundleContext_getService(clientContext, ref, (void **)&tst);
+        CHECK_EQUAL(CELIX_SUCCESS, rc);
         CHECK(tst != NULL);
 
         rc = tst->test(tst->handle);
-        CHECK_EQUAL(0, rc);
+        CHECK_EQUAL(CELIX_SUCCESS, rc);
 
         bool result;
         bundleContext_ungetService(clientContext, ref, &result);

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp b/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
index 3c64f95..d733909 100644
--- a/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
+++ b/remote_services/remote_service_admin_dfi/rsa_tst/rsa_tests.cpp
@@ -136,6 +136,10 @@ extern "C" {
         CHECK_EQUAL(CELIX_SUCCESS, rc);
 
         CHECK_EQUAL(1, arrayList_size(regs));
+
+        rc = rsa->exportRegistration_close(rsa->admin,(export_registration_pt)(arrayList_get(regs,0)));
+        CHECK_EQUAL(CELIX_SUCCESS, rc);
+
     }
 
     static void testImportService(void) {
@@ -164,6 +168,9 @@ extern "C" {
         rc = bundleContext_ungetServiceReference(context, ref);
         CHECK_EQUAL(CELIX_SUCCESS, rc);
 
+        rc = endpointDescription_destroy(endpoint);
+        CHECK_EQUAL(CELIX_SUCCESS, rc);
+
         /* Cannot test. uses requesting bundles descriptor
         void *service = NULL;
         rc = bundleContext_getService(context, ref, &service);

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c b/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
index 8567e23..2420fed 100644
--- a/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
+++ b/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
@@ -460,11 +460,11 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
 }
 
 celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration) {
-    celix_status_t status = CELIX_SUCCESS;
+    celix_status_t status;
+    export_reference_pt ref = NULL;
 
     logHelper_log(admin->loghelper, OSGI_LOGSERVICE_INFO, "RSA_HTTP: Removing exported service");
 
-    export_reference_pt ref = NULL;
     status = exportRegistration_getExportReference(registration, &ref);
 
     if (status == CELIX_SUCCESS) {
@@ -472,7 +472,10 @@ celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt
         celixThreadMutex_lock(&admin->exportedServicesLock);
     	exportReference_getExportedService(ref, &servRef);
 
-    	hashMap_remove(admin->exportedServices, servRef);
+    	array_list_pt registrations = (array_list_pt)hashMap_remove(admin->exportedServices, servRef);
+    	if(registrations!=NULL){
+    		arrayList_destroy(registrations);
+    	}
 
         exportRegistration_close(registration);
         exportRegistration_destroy(&registration);
@@ -550,12 +553,13 @@ static celix_status_t remoteServiceAdmin_getIpAdress(char* interface, char** ip)
 	celix_status_t status = CELIX_BUNDLE_EXCEPTION;
 
 	struct ifaddrs *ifaddr, *ifa;
-    char host[NI_MAXHOST];
 
     if (getifaddrs(&ifaddr) != -1)
     {
 		for (ifa = ifaddr; ifa != NULL && status != CELIX_SUCCESS; ifa = ifa->ifa_next)
 		{
+		    char host[NI_MAXHOST];
+
 			if (ifa->ifa_addr == NULL)
 				continue;
 

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
index a2a087a..5c88b99 100644
--- a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
+++ b/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
@@ -96,9 +96,15 @@ extern "C" {
 		celix_status_t status;
 		service_reference_pt ref = NULL;
 		calculator_service_pt calcService = NULL;
-		usleep(2000000); //TODO use tracker
+        int retries = 4;
+
+        while (ref == NULL && retries > 0) {
+            printf("Waiting for service .. %d\n", retries);
+            status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
+            usleep(1000000);
+            --retries;
+        }
 
-		status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
 		CHECK_EQUAL(CELIX_SUCCESS, status);
 		CHECK(ref != NULL);
 

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
index 813fa19..adcfe91 100644
--- a/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
+++ b/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
@@ -553,7 +553,7 @@ celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, c
 }
 
 celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt admin, export_registration_pt registration) {
-    celix_status_t status = CELIX_SUCCESS;
+    celix_status_t status;
     ipc_segment_pt ipc = NULL;
 
     export_reference_pt ref = NULL;
@@ -566,7 +566,10 @@ celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt
         celixThreadMutex_lock(&admin->exportedServicesLock);
         exportReference_getExportedService(ref, &servRef);
 
-        hashMap_remove(admin->exportedServices, servRef);
+        array_list_pt exports = (array_list_pt)hashMap_remove(admin->exportedServices, servRef);
+        if(exports!=NULL){
+        	arrayList_destroy(exports);
+        }
 
         exportRegistration_close(registration);
 
@@ -601,6 +604,10 @@ celix_status_t remoteServiceAdmin_removeExportedService(remote_service_admin_pt
         exportRegistration_destroy(&registration);
     }
 
+    if(ref!=NULL){
+    	free(ref);
+    }
+
     celixThreadMutex_unlock(&admin->exportedServicesLock);
 
     return status;
@@ -863,6 +870,11 @@ celix_status_t remoteServiceAdmin_removeImportedService(remote_service_admin_pt
             logHelper_log(admin->loghelper, OSGI_LOGSERVICE_ERROR, "Error while detaching IPC segment for imported service %s.", endpointDescription->service);
         }
 
+        ipc = hashMap_remove(admin->importedIpcSegment,endpointDescription);
+        if(ipc!=NULL){
+        	free(ipc);
+        }
+
         // factory available
         if ((registration_factory == NULL) || (registration_factory->trackedFactory == NULL)) {
             logHelper_log(admin->loghelper, OSGI_LOGSERVICE_ERROR, "Error while retrieving registration factory for imported service %s.", endpointDescription->service);

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
index b2ebb39..102c0b1 100644
--- a/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
+++ b/remote_services/remote_service_admin_shm/private/test/rsa_client_server_tests.cpp
@@ -95,9 +95,16 @@ extern "C" {
 		celix_status_t status;
 		service_reference_pt ref = NULL;
 		calculator_service_pt calcService = NULL;
-		usleep(2000000); //TODO use tracker
+		int retries = 6;
+
+        while (ref == NULL && retries > 0) {
+            printf("Waiting for service .. %d\n", retries);
+            status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
+            usleep(1000000);
+            --retries;
+        }
+
 
-		status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
 		CHECK_EQUAL(CELIX_SUCCESS, status);
 		CHECK(ref != NULL);
 
@@ -463,9 +470,9 @@ TEST(RsaShmClientServerTests, TestImport) {
 }
 
 TEST(RsaShmClientServerTests, TestExport) {
-	// test is currenlty failing
-	//testExport();
+	testExport();
 }
+
 /*
 TEST(RsaShmClientServerTests, TestProxyRemoval) {
 	// test is currenlty failing

http://git-wip-us.apache.org/repos/asf/celix/blob/52528fdc/remote_services/topology_manager/private/src/topology_manager.c
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/private/src/topology_manager.c b/remote_services/topology_manager/private/src/topology_manager.c
index 46a3146..cea9330 100644
--- a/remote_services/topology_manager/private/src/topology_manager.c
+++ b/remote_services/topology_manager/private/src/topology_manager.c
@@ -313,6 +313,9 @@ celix_status_t topologyManager_rsaRemoved(void * handle, service_reference_pt re
             }
 
             hashMap_remove(exports, rsa);
+            /*if(exports_list!=NULL){
+            	arrayList_destroy(exports_list);
+            }*/
 
             if (hashMap_size(exports) == 0) {
                 hashMap_remove(manager->exportedServices, key);
@@ -668,6 +671,7 @@ celix_status_t topologyManager_removeExportedService(topology_manager_pt manager
                 }
 
                 hashMap_remove(exports, rsa);
+                arrayList_destroy(exportRegistrations);
                 hashMapIterator_destroy(iter);
                 iter = hashMapIterator_create(exports);