You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by er...@apache.org on 2017/02/23 13:59:06 UTC
celix git commit: CELIX-403: Free service-listener memory if tracker
is closed to fix memory leak.
Repository: celix
Updated Branches:
refs/heads/develop 8670cae69 -> 3b802c90f
CELIX-403: Free service-listener memory if tracker is closed to fix memory leak.
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/3b802c90
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/3b802c90
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/3b802c90
Branch: refs/heads/develop
Commit: 3b802c90f1fc720b42ee28b052128724108d37d0
Parents: 8670cae
Author: Erjan Altena <er...@gmail.com>
Authored: Thu Feb 23 14:56:01 2017 +0100
Committer: Erjan Altena <er...@gmail.com>
Committed: Thu Feb 23 14:58:36 2017 +0100
----------------------------------------------------------------------
.../private/src/activator.c | 21 ++++++++++++++++++++
framework/private/src/service_tracker.c | 5 ++++-
2 files changed, 25 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/3b802c90/examples/service_hook_example/private/src/activator.c
----------------------------------------------------------------------
diff --git a/examples/service_hook_example/private/src/activator.c b/examples/service_hook_example/private/src/activator.c
index 77238aa..f2d2a15 100644
--- a/examples/service_hook_example/private/src/activator.c
+++ b/examples/service_hook_example/private/src/activator.c
@@ -24,6 +24,7 @@
* \copyright Apache License, Version 2.0
*/
#include <stdlib.h>
+#include <unistd.h>
#include <stdio.h>
#include "bundle_activator.h"
@@ -86,12 +87,32 @@ celix_status_t bundleActivator_start(void * handle, bundle_context_pt context) {
userData->hookService = hookService;
userData->hookReg = NULL;
+ printf("Registering hook service\n");
+ bundleContext_registerService(context, OSGI_FRAMEWORK_LISTENER_HOOK_SERVICE_NAME, hookService, NULL, &userData->hookReg);
+
+ printf("Unregistering hook service\n");
+ serviceRegistration_unregister(userData->hookReg);
+
+ printf("Re-Registering hook service\n");
+ userData->hookReg = NULL;
bundleContext_registerService(context, OSGI_FRAMEWORK_LISTENER_HOOK_SERVICE_NAME, hookService, NULL, &userData->hookReg);
userData->trackerAfter = 0;
serviceTracker_create(context, "MY_SERVICE_AFTER_REGISTERING_HOOK", NULL, &userData->trackerAfter);
serviceTracker_open(userData->trackerAfter);
+ sleep(1);
+ printf("Closing tracker\n");
+ serviceTracker_close(userData->trackerAfter);
+ printf("Reopening tracker\n");
+ serviceTracker_open(userData->trackerAfter);
+
+ sleep(1);
+ printf("Closing tracker\n");
+ serviceTracker_close(userData->trackerAfter);
+ printf("Reopening tracker\n");
+ serviceTracker_open(userData->trackerAfter);
+
return CELIX_SUCCESS;
}
http://git-wip-us.apache.org/repos/asf/celix/blob/3b802c90/framework/private/src/service_tracker.c
----------------------------------------------------------------------
diff --git a/framework/private/src/service_tracker.c b/framework/private/src/service_tracker.c
index d43b362..2631058 100644
--- a/framework/private/src/service_tracker.c
+++ b/framework/private/src/service_tracker.c
@@ -166,8 +166,11 @@ celix_status_t serviceTracker_close(service_tracker_pt tracker) {
}
if (status == CELIX_SUCCESS) {
status = bundleContext_removeServiceListener(tracker->context, tracker->listener);
+ if(status == CELIX_SUCCESS) {
+ free(tracker->listener);
+ tracker->listener = NULL;
+ }
}
-
framework_logIfError(logger, status, NULL, "Cannot close tracker");
return status;