CELIX-237: Fixed an issue in service_regisration, the ungetService for a service factory was not correctly called (wrong handle).
Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/aa1797ab Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/aa1797ab Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/aa1797ab Branch: refs/heads/feature/CELIX-230_Refactoring_of_the_shell_command_service Commit: aa1797ab90090ea556d4e367c390e5430cefea6c Parents: 2fe04c0 Author: Pepijn Noltes <pepijnnol...@gmail.com> Authored: Thu Oct 15 09:56:00 2015 +0200 Committer: Pepijn Noltes <pepijnnol...@gmail.com> Committed: Thu Oct 15 09:56:00 2015 +0200 ---------------------------------------------------------------------- framework/private/src/service_registration.c | 2 +- .../rsa/private/src/import_registration_dfi.c | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/aa1797ab/framework/private/src/service_registration.c ---------------------------------------------------------------------- diff --git a/framework/private/src/service_registration.c b/framework/private/src/service_registration.c index 82d0ee9..1817784 100644 --- a/framework/private/src/service_registration.c +++ b/framework/private/src/service_registration.c @@ -163,7 +163,7 @@ celix_status_t serviceRegistration_getService(service_registration_pt registrati celix_status_t serviceRegistration_ungetService(service_registration_pt registration, bundle_pt bundle, void **service) { if (registration->isServiceFactory) { service_factory_pt factory = registration->serviceFactory; - factory->ungetService(registration->serviceFactory, bundle, registration, service); + factory->ungetService(factory->factory, bundle, registration, service); } return CELIX_SUCCESS; } http://git-wip-us.apache.org/repos/asf/celix/blob/aa1797ab/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 8616f0c..cb40f0b 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 @@ -13,7 +13,6 @@ struct import_registration { const char *classObject; //NOTE owned by endpoint celix_thread_mutex_t mutex; //protects send & sendhandle - send_func_type send; void *sendHandle; @@ -27,7 +26,7 @@ struct import_registration { struct service_proxy { dyn_interface_type *intf; void *service; - int count; + size_t count; }; static celix_status_t importRegistration_createProxy(import_registration_pt import, bundle_pt bundle, @@ -128,12 +127,13 @@ celix_status_t importRegistration_start(import_registration_pt import) { celix_status_t importRegistration_stop(import_registration_pt import) { celix_status_t status = CELIX_SUCCESS; - importRegistration_clearProxies(import); - if (import->factoryReg != NULL) { serviceRegistration_unregister(import->factoryReg); + import->factoryReg = NULL; } + importRegistration_clearProxies(import); + return status; } @@ -289,10 +289,6 @@ static void importRegistration_proxyFunc(void *userData, void *args[], void *ret celix_status_t importRegistration_ungetService(import_registration_pt import, bundle_pt bundle, service_registration_pt registration, void **out) { celix_status_t status = CELIX_SUCCESS; - return status; - - /* TODO, FIXME ungetService can happen after importRegistration destroy leading to segfaults - assert(import != NULL); assert(import->proxies != NULL); @@ -307,14 +303,14 @@ celix_status_t importRegistration_ungetService(import_registration_pt import, bu } if (proxy->count == 0) { + hashMap_remove(import->proxies, bundle); importRegistration_destroyProxy(proxy); } } - pthread_mutex_lock(&import->proxiesMutex); + pthread_mutex_unlock(&import->proxiesMutex); return status; - */ } static void importRegistration_destroyProxy(struct service_proxy *proxy) {