Repository: celix Updated Branches: refs/heads/develop 8109f6ca7 -> ab3696971
CELIX-452: Add the usage of retain/release concept in the framework.c so that serviceListeners lock can be kept local. - Also refactors the name of service_listener to celix_service_listener and service_event to celix_service_event (also kept the old typedefs) - Also refactors service trackers usage count to the retain/release naming Project: http://git-wip-us.apache.org/repos/asf/celix/repo Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/d1803163 Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/d1803163 Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/d1803163 Branch: refs/heads/develop Commit: d18031633e369edac0f482dd40f607c0caa9e2f6 Parents: 8109f6c Author: Pepijn Noltes <[email protected]> Authored: Tue Jul 10 17:35:41 2018 +0200 Committer: Pepijn Noltes <[email protected]> Committed: Tue Jul 10 17:35:41 2018 +0200 ---------------------------------------------------------------------- .../refining_driver/src/refining_driver.c | 8 +- .../private/include/event_admin_impl.h | 2 +- .../private/include/event_handler_impl.h | 2 +- .../private/include/event_publisher_impl.h | 2 +- bundles/pubsub/pubsub_spi/src/pubsub_utils.c | 9 +- .../discovery_common/src/discovery.c | 2 + .../topology_manager/src/activator.c | 6 +- .../topology_manager/src/scope.c | 9 +- .../topology_manager/src/topology_manager.c | 4 +- .../topology_manager/src/topology_manager.h | 2 +- cmake/cmake_celix/runtime_common.sh.in | 3 +- libs/framework/include/bundle.h | 9 +- libs/framework/include/bundle_context.h | 7 +- libs/framework/include/celix_bundle_context.h | 1 + libs/framework/include/celix_service_event.h | 46 ++++ libs/framework/include/celix_service_listener.h | 42 ++++ libs/framework/include/service_event.h | 42 +--- libs/framework/include/service_listener.h | 28 +-- libs/framework/include/service_reference.h | 7 - libs/framework/include/service_registration.h | 1 - libs/framework/include/service_registry.h | 4 +- libs/framework/include/service_tracker.h | 4 +- .../private/mock/bundle_context_mock.c | 4 +- libs/framework/private/mock/framework_mock.c | 6 +- .../private/mock/service_registration_mock.c | 9 +- .../private/test/bundle_context_test.cpp | 4 +- .../private/test/service_reference_test.cpp | 1 + .../private/test/service_registration_test.cpp | 9 +- .../private/test/service_registry_test.cpp | 2 +- .../private/test/service_tracker_test.cpp | 20 +- libs/framework/src/bundle_context.c | 4 +- libs/framework/src/framework.c | 242 +++++++++++-------- libs/framework/src/framework_private.h | 17 +- libs/framework/src/service_tracker.c | 106 ++++---- libs/framework/src/service_tracker_private.h | 3 +- .../tst/bundle_context_services_test.cpp | 8 +- libs/utils/include/celix_properties.h | 4 +- libs/utils/src/filter.c | 4 +- libs/utils/src/properties.c | 14 +- 39 files changed, 366 insertions(+), 331 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/device_access/example/refining_driver/src/refining_driver.c ---------------------------------------------------------------------- diff --git a/bundles/device_access/example/refining_driver/src/refining_driver.c b/bundles/device_access/example/refining_driver/src/refining_driver.c index 404bc42..903aa6a 100644 --- a/bundles/device_access/example/refining_driver/src/refining_driver.c +++ b/bundles/device_access/example/refining_driver/src/refining_driver.c @@ -52,7 +52,7 @@ struct refining_driver_device { refining_driver_pt driver; service_reference_pt baseServiceReference; service_registration_pt deviceRegistration; - service_listener_pt listener; + celix_service_listener_t *listener; }; celix_status_t refiningDriver_destroy(refining_driver_pt driver) { @@ -109,7 +109,7 @@ static celix_status_t refiningDriver_stopDevice(refining_driver_device_pt device } -static celix_status_t refiningDriver_serviceChanged(service_listener_pt listener, service_event_pt event) { +static celix_status_t refiningDriver_serviceChanged(celix_service_listener_t *listener, celix_service_event_t *event) { celix_status_t status = CELIX_SUCCESS; refining_driver_device_pt device = listener->handle; if (event->type == OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING) { @@ -148,9 +148,9 @@ celix_status_t refiningDriver_createDevice(refining_driver_pt driver, service_re (*device)->deviceRegistration=NULL; (*device)->listener=NULL; - service_listener_pt listener = calloc(1, sizeof(*listener)); + celix_service_listener_t *listener = calloc(1, sizeof(*listener)); listener->handle=(void *)(*device); - listener->serviceChanged=(celix_status_t (*)(void * listener, service_event_pt event))refiningDriver_serviceChanged; + listener->serviceChanged=(celix_status_t (*)(void * listener, celix_service_event_t *event))refiningDriver_serviceChanged; bundleContext_addServiceListener(driver->context, listener, NULL); (*device)->listener=listener; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/event_admin/event_admin/private/include/event_admin_impl.h ---------------------------------------------------------------------- diff --git a/bundles/event_admin/event_admin/private/include/event_admin_impl.h b/bundles/event_admin/event_admin/private/include/event_admin_impl.h index 20b0f1b..56d3eae 100644 --- a/bundles/event_admin/event_admin/private/include/event_admin_impl.h +++ b/bundles/event_admin/event_admin/private/include/event_admin_impl.h @@ -36,7 +36,7 @@ #include "bundle_activator.h" #include "bundle_context.h" #include "service_tracker.h" -#include "service_listener.h" +#include "celix_service_listener.h" #include "service_registration.h" #include "listener_hook_service.h" #include "event_admin.h" http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/event_admin/event_handler/private/include/event_handler_impl.h ---------------------------------------------------------------------- diff --git a/bundles/event_admin/event_handler/private/include/event_handler_impl.h b/bundles/event_admin/event_handler/private/include/event_handler_impl.h index 44fc671..3bc705a 100644 --- a/bundles/event_admin/event_handler/private/include/event_handler_impl.h +++ b/bundles/event_admin/event_handler/private/include/event_handler_impl.h @@ -33,7 +33,7 @@ #include "bundle_activator.h" #include "bundle_context.h" #include "service_tracker.h" -#include "service_listener.h" +#include "celix_service_listener.h" #include "service_registration.h" #include "listener_hook_service.h" #include "event_constants.h" http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/event_admin/event_publisher/private/include/event_publisher_impl.h ---------------------------------------------------------------------- diff --git a/bundles/event_admin/event_publisher/private/include/event_publisher_impl.h b/bundles/event_admin/event_publisher/private/include/event_publisher_impl.h index a2cab83..f38438e 100644 --- a/bundles/event_admin/event_publisher/private/include/event_publisher_impl.h +++ b/bundles/event_admin/event_publisher/private/include/event_publisher_impl.h @@ -34,7 +34,7 @@ #include "bundle_activator.h" #include "bundle_context.h" #include "service_tracker.h" -#include "service_listener.h" +#include "celix_service_listener.h" #include "service_registration.h" #include "event_constants.h" #include "log_helper.h" http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/pubsub/pubsub_spi/src/pubsub_utils.c ---------------------------------------------------------------------- diff --git a/bundles/pubsub/pubsub_spi/src/pubsub_utils.c b/bundles/pubsub/pubsub_spi/src/pubsub_utils.c index 55185d9..425639e 100644 --- a/bundles/pubsub/pubsub_spi/src/pubsub_utils.c +++ b/bundles/pubsub/pubsub_spi/src/pubsub_utils.c @@ -16,18 +16,13 @@ *specific language governing permissions and limitations *under the License. */ -/* - * pubsub_utils.c - * - * \date Sep 24, 2015 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ #include <string.h> #include <stdlib.h> #include "constants.h" +#include "celix_filter.h" +#include "filter.h" #include "pubsub_common.h" #include "pubsub/publisher.h" http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/remote_services/discovery_common/src/discovery.c ---------------------------------------------------------------------- diff --git a/bundles/remote_services/discovery_common/src/discovery.c b/bundles/remote_services/discovery_common/src/discovery.c index d016c09..d1ce209 100644 --- a/bundles/remote_services/discovery_common/src/discovery.c +++ b/bundles/remote_services/discovery_common/src/discovery.c @@ -28,6 +28,8 @@ #include <netdb.h> #include <string.h> +#include "celix_filter.h" +#include "filter.h" #include "celix_threads.h" #include "bundle_context.h" #include "log_helper.h" http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/remote_services/topology_manager/src/activator.c ---------------------------------------------------------------------- diff --git a/bundles/remote_services/topology_manager/src/activator.c b/bundles/remote_services/topology_manager/src/activator.c index 7f39a25..f292e7e 100644 --- a/bundles/remote_services/topology_manager/src/activator.c +++ b/bundles/remote_services/topology_manager/src/activator.c @@ -50,7 +50,7 @@ struct activator { service_tracker_pt endpointListenerTracker; service_tracker_pt remoteServiceAdminTracker; - service_listener_pt serviceListener; + celix_service_listener_t *serviceListener; endpoint_listener_pt endpointListener; service_registration_pt endpointListenerService; @@ -67,7 +67,7 @@ struct activator { static celix_status_t bundleActivator_createEPLTracker(struct activator *activator, service_tracker_pt *tracker); static celix_status_t bundleActivator_createRSATracker(struct activator *activator, service_tracker_pt *tracker); -static celix_status_t bundleActivator_createServiceListener(struct activator *activator, service_listener_pt *listener); +static celix_status_t bundleActivator_createServiceListener(struct activator *activator, celix_service_listener_t **listener); celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) { celix_status_t status = CELIX_SUCCESS; @@ -155,7 +155,7 @@ static celix_status_t bundleActivator_createRSATracker(struct activator *activat return status; } -static celix_status_t bundleActivator_createServiceListener(struct activator *activator, service_listener_pt *listener) { +static celix_status_t bundleActivator_createServiceListener(struct activator *activator, celix_service_listener_t **listener) { celix_status_t status = CELIX_SUCCESS; *listener = malloc(sizeof(**listener)); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/remote_services/topology_manager/src/scope.c ---------------------------------------------------------------------- diff --git a/bundles/remote_services/topology_manager/src/scope.c b/bundles/remote_services/topology_manager/src/scope.c index b81d050..3b5bffa 100644 --- a/bundles/remote_services/topology_manager/src/scope.c +++ b/bundles/remote_services/topology_manager/src/scope.c @@ -16,13 +16,7 @@ *specific language governing permissions and limitations *under the License. */ -/* - * scope.c - * - * \date Sep 29, 2015 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -30,6 +24,7 @@ #include "tm_scope.h" #include "topology_manager.h" #include "utils.h" +#include "filter.h" struct scope_item { properties_pt props; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/remote_services/topology_manager/src/topology_manager.c ---------------------------------------------------------------------- diff --git a/bundles/remote_services/topology_manager/src/topology_manager.c b/bundles/remote_services/topology_manager/src/topology_manager.c index 2126df5..eee9e5d 100644 --- a/bundles/remote_services/topology_manager/src/topology_manager.c +++ b/bundles/remote_services/topology_manager/src/topology_manager.c @@ -376,9 +376,9 @@ celix_status_t topologyManager_rsaRemoved(void * handle, service_reference_pt re } -celix_status_t topologyManager_serviceChanged(void *listener, service_event_pt event) { +celix_status_t topologyManager_serviceChanged(void *listener, celix_service_event_t *event) { celix_status_t status = CELIX_SUCCESS; - service_listener_pt listen = listener; + celix_service_listener_t *listen = listener; topology_manager_pt manager = listen->handle; const char* export = NULL; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/bundles/remote_services/topology_manager/src/topology_manager.h ---------------------------------------------------------------------- diff --git a/bundles/remote_services/topology_manager/src/topology_manager.h b/bundles/remote_services/topology_manager/src/topology_manager.h index b6ee064..33a977e 100644 --- a/bundles/remote_services/topology_manager/src/topology_manager.h +++ b/bundles/remote_services/topology_manager/src/topology_manager.h @@ -52,7 +52,7 @@ celix_status_t topologyManager_endpointListenerAdded(void* handle, service_refer celix_status_t topologyManager_endpointListenerModified(void * handle, service_reference_pt reference, void* service); celix_status_t topologyManager_endpointListenerRemoved(void * handle, service_reference_pt reference, void* service); -celix_status_t topologyManager_serviceChanged(void *listener, service_event_pt event); +celix_status_t topologyManager_serviceChanged(void *listener, celix_service_event_t *event); celix_status_t topologyManager_addImportedService(void *handle, endpoint_description_pt endpoint, char *matchedFilter); celix_status_t topologyManager_removeImportedService(void *handle, endpoint_description_pt endpoint, char *matchedFilter); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/cmake/cmake_celix/runtime_common.sh.in ---------------------------------------------------------------------- diff --git a/cmake/cmake_celix/runtime_common.sh.in b/cmake/cmake_celix/runtime_common.sh.in index 286aa40..de0c955 100644 --- a/cmake/cmake_celix/runtime_common.sh.in +++ b/cmake/cmake_celix/runtime_common.sh.in @@ -36,7 +36,8 @@ KILL_OPTS="${KILL_OPTS:--2}" #default is -2, e.g. SIGINT PATIENCE="${PATIENCE:-5}" #in seconds PIDS="" -WAIT_FOR_PID="" + +="" RUNTIME_STARTTIME=$(date +"%s") trap stop_all INT http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/bundle.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/bundle.h b/libs/framework/include/bundle.h index 1cd100a..fdc438b 100644 --- a/libs/framework/include/bundle.h +++ b/libs/framework/include/bundle.h @@ -16,13 +16,6 @@ *specific language governing permissions and limitations *under the License. */ -/* - * bundle.h - * - * \date Mar 23, 2010 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ #ifndef BUNDLE_H_ #define BUNDLE_H_ @@ -36,9 +29,9 @@ #include "wire.h" #include "module.h" #include "service_reference.h" -#include "bundle_context.h" #include "celix_log.h" #include "celix_threads.h" +#include "bundle_context.h" #ifdef __cplusplus extern "C" { http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/bundle_context.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/bundle_context.h b/libs/framework/include/bundle_context.h index cf42314..97a264b 100644 --- a/libs/framework/include/bundle_context.h +++ b/libs/framework/include/bundle_context.h @@ -30,11 +30,12 @@ #include "service_factory.h" #include "celix_service_factory.h" -#include "service_listener.h" +#include "celix_service_listener.h" #include "bundle_listener.h" #include "framework_listener.h" #include "properties.h" #include "array_list.h" +#include "celix_service_listener.h" #include "dm_dependency_manager.h" @@ -124,10 +125,10 @@ FRAMEWORK_EXPORT celix_status_t bundleContext_getBundles(bundle_context_pt conte FRAMEWORK_EXPORT celix_status_t bundleContext_getBundleById(bundle_context_pt context, long id, bundle_pt *bundle); FRAMEWORK_EXPORT celix_status_t -bundleContext_addServiceListener(bundle_context_pt context, service_listener_pt listener, const char *filter); +bundleContext_addServiceListener(bundle_context_pt context, celix_service_listener_t *listener, const char *filter); FRAMEWORK_EXPORT celix_status_t -bundleContext_removeServiceListener(bundle_context_pt context, service_listener_pt listener); +bundleContext_removeServiceListener(bundle_context_pt context, celix_service_listener_t *listener); FRAMEWORK_EXPORT celix_status_t bundleContext_addBundleListener(bundle_context_pt context, bundle_listener_pt listener); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/celix_bundle_context.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/celix_bundle_context.h b/libs/framework/include/celix_bundle_context.h index 58dca4e..63889cd 100644 --- a/libs/framework/include/celix_bundle_context.h +++ b/libs/framework/include/celix_bundle_context.h @@ -21,6 +21,7 @@ #include "celix_service_factory.h" #include "celix_properties.h" #include "celix_array_list.h" +#include "celix_filter.h" #ifndef CELIX_BUNDLE_CONTEXT_H_ #define CELIX_BUNDLE_CONTEXT_H_ http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/celix_service_event.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/celix_service_event.h b/libs/framework/include/celix_service_event.h new file mode 100644 index 0000000..bc6431d --- /dev/null +++ b/libs/framework/include/celix_service_event.h @@ -0,0 +1,46 @@ +/* + *Licensed to the Apache Software Foundation (ASF) under one + *or more contributor license agreements. See the NOTICE file + *distributed with this work for additional information + *regarding copyright ownership. The ASF licenses this file + *to you under the Apache License, Version 2.0 (the + *"License"); you may not use this file except in compliance + *with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + *Unless required by applicable law or agreed to in writing, + *software distributed under the License is distributed on an + *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + *specific language governing permissions and limitations + *under the License. + */ + +#ifndef CELIX_SERVICE_EVENT_H_ +#define CELIX_SERVICE_EVENT_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum celix_service_event_type { + OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED = 0x00000001, + OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED = 0x00000002, + OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING = 0x00000004, + OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED_ENDMATCH = 0x00000008, +} celix_service_event_type_t; + +typedef struct serviceReference * service_reference_pt; //forward declaration + +typedef struct celix_service_event { + service_reference_pt reference; + celix_service_event_type_t type; +} celix_service_event_t; + +#ifdef __cplusplus +} +#endif + +#endif /* CELIX_SERVICE_EVENT_H_ */ http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/celix_service_listener.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/celix_service_listener.h b/libs/framework/include/celix_service_listener.h new file mode 100644 index 0000000..7acf12f --- /dev/null +++ b/libs/framework/include/celix_service_listener.h @@ -0,0 +1,42 @@ +/* + *Licensed to the Apache Software Foundation (ASF) under one + *or more contributor license agreements. See the NOTICE file + *distributed with this work for additional information + *regarding copyright ownership. The ASF licenses this file + *to you under the Apache License, Version 2.0 (the + *"License"); you may not use this file except in compliance + *with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + *Unless required by applicable law or agreed to in writing, + *software distributed under the License is distributed on an + *"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + *specific language governing permissions and limitations + *under the License. + */ + +#ifndef CELIX_SERVICE_LISTENER_H_ +#define CELIX_SERVICE_LISTENER_H_ + +#include "celix_errno.h" +#include "celix_service_event.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct celix_service_listener { + void *handle; + + celix_status_t (*serviceChanged)(void *handle, celix_service_event_t *event); +} celix_service_listener_t; + +#ifdef __cplusplus +} +#endif + + +#endif /* CELIX_SERVICE_LISTENER_H_ */ + http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/service_event.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/service_event.h b/libs/framework/include/service_event.h index a018b07..4970f98 100644 --- a/libs/framework/include/service_event.h +++ b/libs/framework/include/service_event.h @@ -16,53 +16,23 @@ *specific language governing permissions and limitations *under the License. */ -/** - * - * @defgroup ServiceListener Service Listener - * @ingroup framework - * @{ - * - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \date January 11, 2012 - * \copyright Apache License, Version 2.0 - */ + #ifndef SERVICE_EVENT_H_ #define SERVICE_EVENT_H_ -#ifdef __cplusplus -extern "C" { -#endif - -enum serviceEventType { - OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED = 0x00000001, - OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED = 0x00000002, - OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING = 0x00000004, - OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED_ENDMATCH = 0x00000008, -}; -typedef enum serviceEventType service_event_type_e; +#include "celix_service_event.h" -typedef struct serviceEvent *service_event_pt; -#ifdef __cplusplus -} -#endif - -#include "service_reference.h" - -#include "service_reference.h" #ifdef __cplusplus extern "C" { #endif -struct serviceEvent { - service_reference_pt reference; - service_event_type_e type; -}; +//Deprecated use celix_service_event_type_t instead +typedef enum celix_service_event_type service_event_type_e; +typedef struct celix_service_event *service_event_pt; + #ifdef __cplusplus } #endif #endif /* SERVICE_EVENT_H_ */ -/** - * @} - */ http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/service_listener.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/service_listener.h b/libs/framework/include/service_listener.h index c887ba1..4272575 100644 --- a/libs/framework/include/service_listener.h +++ b/libs/framework/include/service_listener.h @@ -16,40 +16,24 @@ *specific language governing permissions and limitations *under the License. */ -/** - * - * @defgroup ServiceListener Service Listener - * @ingroup framework - * @{ - * - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \date January 11, 2012 - * \copyright Apache License, Version 2.0 - */ + #ifndef SERVICE_LISTENER_H_ #define SERVICE_LISTENER_H_ -typedef struct serviceListener * service_listener_pt; -#include "celix_errno.h" -#include "service_event.h" +#include "celix_service_listener.h" + #ifdef __cplusplus extern "C" { #endif -struct serviceListener { - void *handle; +//Deprecated use celix_service_listener_t instead +typedef struct celix_service_listener *service_listener_pt; - celix_status_t (*serviceChanged)(void *listener, service_event_pt event); -}; #ifdef __cplusplus } #endif -#endif /* SERVICE_LISTENER_H_ */ - -/** - * @} - */ +#endif /* SERVICE_LISTENER_H_ */ \ No newline at end of file http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/service_reference.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/service_reference.h b/libs/framework/include/service_reference.h index 3d84526..aff427a 100644 --- a/libs/framework/include/service_reference.h +++ b/libs/framework/include/service_reference.h @@ -16,13 +16,6 @@ *specific language governing permissions and limitations *under the License. */ -/* - * service_reference.h - * - * \date Jul 20, 2010 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ #ifndef SERVICE_REFERENCE_H_ #define SERVICE_REFERENCE_H_ http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/service_registration.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/service_registration.h b/libs/framework/include/service_registration.h index 8cb5f29..8e661ec 100644 --- a/libs/framework/include/service_registration.h +++ b/libs/framework/include/service_registration.h @@ -27,7 +27,6 @@ typedef struct serviceRegistration * service_registration_pt; typedef struct serviceRegistration service_registration_t; -#include "service_registry.h" #include "array_list.h" #include "bundle.h" #include "framework_exports.h" http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/service_registry.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/service_registry.h b/libs/framework/include/service_registry.h index 9ca4a59..5a3c790 100644 --- a/libs/framework/include/service_registry.h +++ b/libs/framework/include/service_registry.h @@ -33,7 +33,7 @@ typedef struct celix_serviceRegistry celix_service_registry_t; #include "properties.h" #include "filter.h" #include "service_factory.h" -#include "service_event.h" +#include "celix_service_event.h" #include "array_list.h" #include "service_registration.h" #include "celix_service_factory.h" @@ -42,7 +42,7 @@ typedef struct celix_serviceRegistry celix_service_registry_t; extern "C" { #endif -typedef void (*serviceChanged_function_pt)(framework_pt, service_event_type_e, service_registration_pt, properties_pt); +typedef void (*serviceChanged_function_pt)(framework_pt, celix_service_event_type_t, service_registration_pt, properties_pt); celix_status_t serviceRegistry_create(framework_pt framework, serviceChanged_function_pt serviceChanged, service_registry_pt *registry); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/include/service_tracker.h ---------------------------------------------------------------------- diff --git a/libs/framework/include/service_tracker.h b/libs/framework/include/service_tracker.h index db65776..7fb5f54 100644 --- a/libs/framework/include/service_tracker.h +++ b/libs/framework/include/service_tracker.h @@ -27,7 +27,7 @@ #ifndef SERVICE_TRACKER_H_ #define SERVICE_TRACKER_H_ -#include "service_listener.h" +#include "celix_service_listener.h" #include "array_list.h" #include "service_tracker_customizer.h" #include "framework_exports.h" @@ -68,7 +68,7 @@ FRAMEWORK_EXPORT array_list_pt serviceTracker_getServices(service_tracker_t *tra FRAMEWORK_EXPORT void *serviceTracker_getServiceByReference(service_tracker_t *tracker, service_reference_pt reference); -FRAMEWORK_EXPORT void serviceTracker_serviceChanged(service_listener_pt listener, service_event_pt event); +FRAMEWORK_EXPORT void serviceTracker_serviceChanged(celix_service_listener_t *listener, celix_service_event_t *event); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/mock/bundle_context_mock.c ---------------------------------------------------------------------- diff --git a/libs/framework/private/mock/bundle_context_mock.c b/libs/framework/private/mock/bundle_context_mock.c index 7c0b6e6..15e4fe9 100644 --- a/libs/framework/private/mock/bundle_context_mock.c +++ b/libs/framework/private/mock/bundle_context_mock.c @@ -160,7 +160,7 @@ celix_status_t bundleContext_getBundleById(bundle_context_pt context, long id, b } -celix_status_t bundleContext_addServiceListener(bundle_context_pt context, service_listener_pt listener, const char * filter) { +celix_status_t bundleContext_addServiceListener(bundle_context_pt context, celix_service_listener_t *listener, const char * filter) { mock_c()->actualCall("bundleContext_addServiceListener") ->withPointerParameters("context", context) ->withPointerParameters("listener", listener) @@ -168,7 +168,7 @@ celix_status_t bundleContext_addServiceListener(bundle_context_pt context, servi return mock_c()->returnValue().value.intValue; } -celix_status_t bundleContext_removeServiceListener(bundle_context_pt context, service_listener_pt listener) { +celix_status_t bundleContext_removeServiceListener(bundle_context_pt context, celix_service_listener_t *listener) { mock_c()->actualCall("bundleContext_removeServiceListener") ->withPointerParameters("context", context) ->withPointerParameters("listener", listener); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/mock/framework_mock.c ---------------------------------------------------------------------- diff --git a/libs/framework/private/mock/framework_mock.c b/libs/framework/private/mock/framework_mock.c index 7bbd752..eaae1eb 100644 --- a/libs/framework/private/mock/framework_mock.c +++ b/libs/framework/private/mock/framework_mock.c @@ -193,7 +193,7 @@ celix_status_t fw_getBundleServicesInUse(framework_pt framework, bundle_pt bundl } -void fw_addServiceListener(framework_pt framework, bundle_pt bundle, service_listener_pt listener, const char* filter) { +void fw_addServiceListener(framework_pt framework, bundle_pt bundle, celix_service_listener_t *listener, const char* filter) { mock_c()->actualCall("fw_addServiceListener") ->withPointerParameters("framework", framework) ->withPointerParameters("bundle", bundle) @@ -201,7 +201,7 @@ void fw_addServiceListener(framework_pt framework, bundle_pt bundle, service_lis ->withStringParameters("filter", filter); } -void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, service_listener_pt listener) { +void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, celix_service_listener_t *listener) { mock_c()->actualCall("fw_removeServiceListener") ->withPointerParameters("framework", framework) ->withPointerParameters("bundle", bundle) @@ -241,7 +241,7 @@ celix_status_t fw_removeFrameworkListener(framework_pt framework, bundle_pt bund return mock_c()->returnValue().value.intValue; } -void fw_serviceChanged(framework_pt framework, service_event_type_e eventType, service_registration_pt registration, properties_pt oldprops) { +void fw_serviceChanged(framework_pt framework, celix_service_event_type_t eventType, service_registration_pt registration, properties_pt oldprops) { mock_c()->actualCall("fw_serviceChanged"); } http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/mock/service_registration_mock.c ---------------------------------------------------------------------- diff --git a/libs/framework/private/mock/service_registration_mock.c b/libs/framework/private/mock/service_registration_mock.c index 69be7eb..5908de9 100644 --- a/libs/framework/private/mock/service_registration_mock.c +++ b/libs/framework/private/mock/service_registration_mock.c @@ -16,18 +16,13 @@ *specific language governing permissions and limitations *under the License. */ -/* - * service_registration_mock.c - * - * \date Feb 7, 2013 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ + #include <CppUTestExt/MockSupport_c.h> #include "CppUTestExt/MockSupport_c.h" #include "service_registration.h" #include "service_registration_private.h" +#include "service_registry.h" service_registration_pt serviceRegistration_create(registry_callback_t callback, bundle_pt bundle, const char* serviceName, unsigned long serviceId, const void* serviceObject, properties_pt dictionary) { mock_c()->actualCall("serviceRegistration_create") http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/test/bundle_context_test.cpp ---------------------------------------------------------------------- diff --git a/libs/framework/private/test/bundle_context_test.cpp b/libs/framework/private/test/bundle_context_test.cpp index 9ae57e0..ad376ff 100644 --- a/libs/framework/private/test/bundle_context_test.cpp +++ b/libs/framework/private/test/bundle_context_test.cpp @@ -452,7 +452,7 @@ TEST(bundle_context, addServiceListener) { context->framework = framework; context->bundle = bundle; - service_listener_pt listener = (service_listener_pt) 0x30; + celix_service_listener_t *listener = (celix_service_listener_t*) 0x30; char filter[] = ""; mock().expectOneCall("fw_addServiceListener") .withParameter("framework", framework) @@ -479,7 +479,7 @@ TEST(bundle_context, removeServiceListener) { context->framework = framework; context->bundle = bundle; - service_listener_pt listener = (service_listener_pt) 0x30; + celix_service_listener_t *listener = (celix_service_listener_t*) 0x30; mock().expectOneCall("fw_removeServiceListener") .withParameter("framework", framework) .withParameter("bundle", bundle) http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/test/service_reference_test.cpp ---------------------------------------------------------------------- diff --git a/libs/framework/private/test/service_reference_test.cpp b/libs/framework/private/test/service_reference_test.cpp index 8d2bad4..27a59d5 100644 --- a/libs/framework/private/test/service_reference_test.cpp +++ b/libs/framework/private/test/service_reference_test.cpp @@ -37,6 +37,7 @@ extern "C" { #include "service_reference.h" #include "constants.h" #include "celix_log.h" +#include "service_registry.h" #include "CppUTestExt/MockSupport_c.h" framework_logger_pt logger = (framework_logger_pt) 0x42; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/test/service_registration_test.cpp ---------------------------------------------------------------------- diff --git a/libs/framework/private/test/service_registration_test.cpp b/libs/framework/private/test/service_registration_test.cpp index 68986bf..ea5efb4 100644 --- a/libs/framework/private/test/service_registration_test.cpp +++ b/libs/framework/private/test/service_registration_test.cpp @@ -16,13 +16,7 @@ *specific language governing permissions and limitations *under the License. */ -/* - * service_registration_test.cpp - * - * \date Feb 8, 2013 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ + #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -37,6 +31,7 @@ extern "C" { #include "CppUTestExt/MockSupport_c.h" #include "service_registration_private.h" #include "celix_log.h" +#include "service_registry.h" framework_logger_pt logger = (framework_logger_pt) 0x42; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/test/service_registry_test.cpp ---------------------------------------------------------------------- diff --git a/libs/framework/private/test/service_registry_test.cpp b/libs/framework/private/test/service_registry_test.cpp index 5adf4f6..9614844 100644 --- a/libs/framework/private/test/service_registry_test.cpp +++ b/libs/framework/private/test/service_registry_test.cpp @@ -43,7 +43,7 @@ extern "C" { framework_logger_pt logger = (framework_logger_pt) 0x42; -void serviceRegistryTest_serviceChanged(framework_pt framework, service_event_type_e eventType, service_registration_pt registration, properties_pt oldprops) { +void serviceRegistryTest_serviceChanged(framework_pt framework, celix_service_event_type_t eventType, service_registration_pt registration, properties_pt oldprops) { mock_c()->actualCall("serviceRegistryTest_serviceChanged") ->withPointerParameters("framework", framework) ->withIntParameters("eventType", eventType) http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/private/test/service_tracker_test.cpp ---------------------------------------------------------------------- diff --git a/libs/framework/private/test/service_tracker_test.cpp b/libs/framework/private/test/service_tracker_test.cpp index 45898a1..678b973 100644 --- a/libs/framework/private/test/service_tracker_test.cpp +++ b/libs/framework/private/test/service_tracker_test.cpp @@ -159,7 +159,7 @@ TEST(service_tracker, destroy) { char * filter = my_strdup("(objectClass=test)"); status = serviceTracker_createWithFilter(context, filter, NULL, &tracker); LONGS_EQUAL(CELIX_SUCCESS, status); - service_listener_pt listener = (service_listener_pt) calloc(1, sizeof(serviceListener)); + celix_service_listener_t *listener = (celix_service_listener_t*) calloc(1, sizeof(serviceListener)); tracker->listener = listener; mock() @@ -325,7 +325,7 @@ TEST(service_tracker, close) { service_tracker_pt tracker = NULL; serviceTracker_create(context, service, NULL, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracked_pt entry = (tracked_pt) malloc(sizeof(*entry)); service_reference_pt ref = (service_reference_pt) 0x02; @@ -585,7 +585,7 @@ TEST(service_tracker, serviceChangedRegistered) { service_tracker_pt tracker = NULL; serviceTracker_create(context, service, NULL, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; @@ -631,7 +631,7 @@ TEST(service_tracker, serviceChangedModified) { service_tracker_pt tracker = NULL; serviceTracker_create(context, service, NULL, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; @@ -677,7 +677,7 @@ TEST(service_tracker, serviceChangedUnregistering) { service_tracker_pt tracker = NULL; serviceTracker_create(context, service, NULL, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; @@ -728,7 +728,7 @@ TEST(service_tracker, serviceChangedModifiedEndmatch) { char * service = my_strdup("service_name"); service_tracker_pt tracker = NULL; serviceTracker_create(context, service, NULL, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; @@ -774,7 +774,7 @@ TEST(service_tracker, serviceChangedRegisteredCustomizer) { service_tracker_pt tracker = NULL; service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20; serviceTracker_create(context, service, customizer, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; @@ -847,7 +847,7 @@ TEST(service_tracker, serviceChangedModifiedCustomizer) { service_tracker_pt tracker = NULL; service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20; serviceTracker_create(context, service, customizer, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; //adding_callback_pt adding_func = NULL; @@ -946,7 +946,7 @@ TEST(service_tracker, serviceChangedUnregisteringCustomizer) { service_tracker_pt tracker = NULL; service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20; serviceTracker_create(context, service, customizer, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; @@ -1015,7 +1015,7 @@ TEST(service_tracker, serviceChangedUnregisteringCustomizerNoFunc) { service_tracker_pt tracker = NULL; service_tracker_customizer_pt customizer = (service_tracker_customizer_pt) 0x20; serviceTracker_create(context, service, customizer, &tracker); - service_listener_pt listener = (service_listener_pt) malloc(sizeof(*listener)); + celix_service_listener_t *listener = (celix_service_listener_t*) malloc(sizeof(*listener)); tracker->listener = listener; listener->handle = tracker; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/src/bundle_context.c ---------------------------------------------------------------------- diff --git a/libs/framework/src/bundle_context.c b/libs/framework/src/bundle_context.c index 84d6346..f51d06e 100644 --- a/libs/framework/src/bundle_context.c +++ b/libs/framework/src/bundle_context.c @@ -317,7 +317,7 @@ celix_status_t bundleContext_getBundleById(bundle_context_pt context, long id, b return status; } -celix_status_t bundleContext_addServiceListener(bundle_context_pt context, service_listener_pt listener, const char* filter) { +celix_status_t bundleContext_addServiceListener(bundle_context_pt context, celix_service_listener_t *listener, const char* filter) { celix_status_t status = CELIX_SUCCESS; if (context != NULL && listener != NULL) { @@ -331,7 +331,7 @@ celix_status_t bundleContext_addServiceListener(bundle_context_pt context, servi return status; } -celix_status_t bundleContext_removeServiceListener(bundle_context_pt context, service_listener_pt listener) { +celix_status_t bundleContext_removeServiceListener(bundle_context_pt context, celix_service_listener_t *listener) { celix_status_t status = CELIX_SUCCESS; if (context != NULL && listener != NULL) { http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/src/framework.c ---------------------------------------------------------------------- diff --git a/libs/framework/src/framework.c b/libs/framework/src/framework.c index fbae5db..8f72521 100644 --- a/libs/framework/src/framework.c +++ b/libs/framework/src/framework.c @@ -107,15 +107,6 @@ celix_status_t fw_refreshHelper_refreshOrRemove(struct fw_refreshHelper * refres celix_status_t fw_refreshHelper_restart(struct fw_refreshHelper * refreshHelper); celix_status_t fw_refreshHelper_stop(struct fw_refreshHelper * refreshHelper); -struct fw_serviceListener { - bundle_pt bundle; - service_listener_pt listener; - filter_pt filter; - array_list_pt retainedReferences; -}; - -typedef struct fw_serviceListener * fw_service_listener_pt; - struct fw_bundleListener { bundle_pt bundle; bundle_listener_pt listener; @@ -153,6 +144,61 @@ struct request { typedef struct request *request_pt; +//TODO move to service registry +typedef struct celix_fw_service_listener_entry { + //only set during creating + celix_bundle_t *bundle; + celix_service_listener_t *listener; + celix_filter_t *filter; + + celix_thread_mutex_t mutex; //protects retainedReferences and useCount + celix_array_list_t* retainedReferences; + size_t useCount; +} celix_fw_service_listener_entry_t; + +static inline celix_fw_service_listener_entry_t* listener_create(celix_bundle_t *bnd, const char *filter, celix_service_listener_t *listener) { + celix_fw_service_listener_entry_t *entry = calloc(1, sizeof(*entry)); + entry->retainedReferences = celix_arrayList_create(); + entry->listener = listener; + entry->bundle = bnd; + if (filter != NULL) { + entry->filter = celix_filter_create(filter); + } + + entry->useCount = 1; + celixThreadMutex_create(&entry->mutex, NULL); + return entry; +} + +static inline void listener_retain(celix_fw_service_listener_entry_t *entry) { + celixThreadMutex_lock(&entry->mutex); + entry->useCount += 1; + celixThreadMutex_unlock(&entry->mutex); +} + +static inline void listener_release(celix_framework_t* framework, celix_fw_service_listener_entry_t *entry) { + celixThreadMutex_lock(&entry->mutex); + entry->useCount -= 1; + int count = entry->useCount; + celixThreadMutex_unlock(&entry->mutex); + //use count == 0 -> safe to destroy. + + if (count == 0) { + //destroy + int rSize = arrayList_size(entry->retainedReferences); + for (int i = 0; i < rSize; i += 1) { + service_reference_pt ref = arrayList_get(entry->retainedReferences, i); + if (ref != NULL) { + serviceRegistry_ungetServiceReference(framework->registry, entry->bundle, ref); // decrease retain counter + } + } + celix_filter_destroy(entry->filter); + celix_arrayList_destroy(entry->retainedReferences); + celixThreadMutex_destroy(&entry->mutex); + free(entry); + } +} + framework_logger_pt logger; //TODO introduce a counter + mutex to control the freeing of the logger when mutiple threads are running a framework. @@ -215,13 +261,13 @@ celix_status_t framework_create(framework_pt *framework, properties_pt config) { status = CELIX_DO_IF(status, celixThreadCondition_init(&(*framework)->condition, NULL)); status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->mutex, NULL)); - status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->installedBundleMapLock, NULL)); - status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->bundleLock, NULL)); - status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->installRequestLock, NULL)); - status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->dispatcherLock, NULL)); + status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->installedBundleMapLock, NULL)); //TODO refactor to use use count with condition (see serviceListeners) + status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->bundleLock, NULL)); //TODO refactor to use use count with condition (see serviceListeners) + status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->installRequestLock, NULL)); //TODO refactor to use use count with condition (see serviceListeners) + status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->dispatcherLock, NULL)); //TODO refactor to use use count with condition (see serviceListeners) status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->serviceListenersLock, &attr)); - status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->frameworkListenersLock, &attr)); - status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->bundleListenerLock, NULL)); + status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->frameworkListenersLock, &attr)); //TODO refactor to use use count with condition (see serviceListeners) + status = CELIX_DO_IF(status, celixThreadMutex_create(&(*framework)->bundleListenerLock, NULL)); //TODO refactor to use use count with condition (see serviceListeners) status = CELIX_DO_IF(status, celixThreadCondition_init(&(*framework)->dispatcher, NULL)); if (status == CELIX_SUCCESS) { (*framework)->bundle = NULL; @@ -372,7 +418,7 @@ celix_status_t fw_init(framework_pt framework) { celix_status_t status = CELIX_SUCCESS; status = CELIX_DO_IF(status, framework_acquireBundleLock(framework, framework->bundle, OSGI_FRAMEWORK_BUNDLE_INSTALLED|OSGI_FRAMEWORK_BUNDLE_RESOLVED|OSGI_FRAMEWORK_BUNDLE_STARTING|OSGI_FRAMEWORK_BUNDLE_ACTIVE)); - status = CELIX_DO_IF(status, arrayList_create(&framework->serviceListeners)); + status = CELIX_DO_IF(status, arrayList_create(&framework->serviceListeners)); //entry is celix_fw_service_listener_entry_t status = CELIX_DO_IF(status, arrayList_create(&framework->bundleListeners)); status = CELIX_DO_IF(status, arrayList_create(&framework->frameworkListeners)); status = CELIX_DO_IF(status, arrayList_create(&framework->requests)); @@ -1359,7 +1405,7 @@ celix_status_t fw_registerService(framework_pt framework, service_registration_p celixThreadMutex_lock(&framework->serviceListenersLock); for (i = 0; i < arrayList_size(framework->serviceListeners); i++) { - fw_service_listener_pt listener =(fw_service_listener_pt) arrayList_get(framework->serviceListeners, i); + celix_fw_service_listener_entry_t *listener = arrayList_get(framework->serviceListeners, i); bundle_context_t *context = NULL; listener_hook_info_pt info = NULL; bundle_context_pt lContext = NULL; @@ -1494,27 +1540,19 @@ celix_status_t framework_ungetService(framework_pt framework, bundle_pt bundle, return serviceRegistry_ungetService(framework->registry, bundle, reference, result); } -void fw_addServiceListener(framework_pt framework, bundle_pt bundle, service_listener_pt listener, const char* sfilter) { +void fw_addServiceListener(framework_pt framework, bundle_pt bundle, celix_service_listener_t *listener, const char* sfilter) { array_list_pt listenerHooks = NULL; unsigned int i; - fw_service_listener_pt fwListener = (fw_service_listener_pt) calloc(1, sizeof(*fwListener)); - bundle_context_t *context = NULL; + celix_fw_service_listener_entry_t *fwListener = listener_create(bundle, sfilter, listener); - fwListener->bundle = bundle; - arrayList_create(&fwListener->retainedReferences); - if (sfilter != NULL) { - filter_pt filter = filter_create(sfilter); - fwListener->filter = filter; - } else { - fwListener->filter = NULL; - } - fwListener->listener = listener; + bundle_context_t *context = NULL; celixThreadMutex_lock(&framework->serviceListenersLock); arrayList_add(framework->serviceListeners, fwListener); celixThreadMutex_unlock(&framework->serviceListenersLock); + //TODO lock listeners hooks? serviceRegistry_getListenerHooks(framework->registry, framework->bundle, &listenerHooks); struct listener_hook_info info; @@ -1543,8 +1581,8 @@ void fw_addServiceListener(framework_pt framework, bundle_pt bundle, service_lis arrayList_destroy(listenerHooks); } -void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, service_listener_pt listener) { - fw_service_listener_pt match = NULL; +void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, celix_service_listener_t *listener) { + celix_fw_service_listener_entry_t *match = NULL; bundle_context_t *context; bundle_getContext(bundle, &context); @@ -1552,7 +1590,7 @@ void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, service_ int i; celixThreadMutex_lock(&framework->serviceListenersLock); for (i = 0; i < arrayList_size(framework->serviceListeners); i++) { - fw_service_listener_pt visit = (fw_service_listener_pt) arrayList_get(framework->serviceListeners, i); + celix_fw_service_listener_entry_t *visit = (celix_fw_service_listener_entry_t*) arrayList_get(framework->serviceListeners, i); if (visit->listener == listener && visit->bundle == bundle) { match = visit; arrayList_remove(framework->serviceListeners, i); @@ -1594,21 +1632,7 @@ void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, service_ } if (match != NULL) { - //unregistering retained service references. For these refs a unregister event will not be triggered. - int rSize = arrayList_size(match->retainedReferences); - for (i = 0; i < rSize; i += 1) { - service_reference_pt ref = arrayList_get(match->retainedReferences, i); - if (ref != NULL) { - serviceRegistry_ungetServiceReference(framework->registry, match->bundle, ref); // decrease retain counter - } - } - - match->bundle = NULL; - filter_destroy(match->filter); - arrayList_destroy(match->retainedReferences); - match->filter = NULL; - match->listener = NULL; - free(match); + listener_release(framework, match); } } @@ -1714,80 +1738,92 @@ celix_status_t fw_removeFrameworkListener(framework_pt framework, bundle_pt bund return status; } -void fw_serviceChanged(framework_pt framework, service_event_type_e eventType, service_registration_pt registration, properties_pt oldprops) { +void fw_serviceChanged(framework_pt framework, celix_service_event_type_t eventType, service_registration_pt registration, properties_pt oldprops) { unsigned int i; - fw_service_listener_pt element; + celix_fw_service_listener_entry_t *entry; + + celix_array_list_t* copy = celix_arrayList_create(); celixThreadMutex_lock(&framework->serviceListenersLock); - if (arrayList_size(framework->serviceListeners) > 0) { - for (i = 0; i < arrayList_size(framework->serviceListeners); i++) { - int matched = 0; - properties_pt props = NULL; - bool matchResult = false; + for (i = 0; i < celix_arrayList_size(framework->serviceListeners); i++) { + entry = (celix_fw_service_listener_entry_t *) celix_arrayList_get(framework->serviceListeners, i); + celix_arrayList_add(copy, entry); + listener_retain(entry); //ensure that use count > 0, so that the listener cannot be destroyed until all pending event are handled. + } + celixThreadMutex_unlock(&framework->serviceListenersLock); - element = (fw_service_listener_pt) arrayList_get(framework->serviceListeners, i); - serviceRegistration_getProperties(registration, &props); - if (element->filter != NULL) { - filter_match(element->filter, props, &matchResult); + for (i = 0; i < celix_arrayList_size(copy); ++i) { + entry = (celix_fw_service_listener_entry_t *) celix_arrayList_get(copy, i); + int matched = 0; + properties_pt props = NULL; + bool matchResult = false; + serviceRegistration_getProperties(registration, &props); + if (entry->filter != NULL) { + filter_match(entry->filter, props, &matchResult); + } + matched = (entry->filter == NULL) || matchResult; + if (matched) { + service_reference_pt reference = NULL; + celix_service_event_t *event; + + event = malloc(sizeof(*event)); + + serviceRegistry_getServiceReference(framework->registry, entry->bundle, registration, &reference); + + //NOTE: that you are never sure that the UNREGISTERED event will by handle by an service_listener. listener could be gone + //Every reference retained is therefore stored and called when a service listener is removed from the framework. + if (eventType == OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED) { + serviceRegistry_retainServiceReference(framework->registry, entry->bundle, reference); + celixThreadMutex_lock(&entry->mutex); + arrayList_add(entry->retainedReferences, reference); //TODO improve by using set (or hashmap) instead of list + celixThreadMutex_unlock(&entry->mutex); } - matched = (element->filter == NULL) || matchResult; - if (matched) { - service_reference_pt reference = NULL; - service_event_pt event; - - event = (service_event_pt) malloc(sizeof (*event)); - - serviceRegistry_getServiceReference(framework->registry, element->bundle, registration, &reference); - - //NOTE: that you are never sure that the UNREGISTERED event will by handle by an service_listener. listener could be gone - //Every reference retained is therefore stored and called when a service listener is removed from the framework. - if (eventType == OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED) { - serviceRegistry_retainServiceReference(framework->registry, element->bundle, reference); - arrayList_add(element->retainedReferences, reference); //TODO improve by using set (or hashmap) instead of list - } - event->type = eventType; - event->reference = reference; + event->type = eventType; + event->reference = reference; - element->listener->serviceChanged(element->listener, event); + entry->listener->serviceChanged(entry->listener, event); - serviceRegistry_ungetServiceReference(framework->registry, element->bundle, reference); + serviceRegistry_ungetServiceReference(framework->registry, entry->bundle, reference); - if (eventType == OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING) { - //if service listener was active when service was registered, release the retained reference - if (arrayList_removeElement(element->retainedReferences, reference)) { - serviceRegistry_ungetServiceReference(framework->registry, element->bundle, reference); // decrease retain counter - } + if (eventType == OSGI_FRAMEWORK_SERVICE_EVENT_UNREGISTERING) { + //if service listener was active when service was registered, release the retained reference + celixThreadMutex_lock(&entry->mutex); + bool removed = arrayList_removeElement(entry->retainedReferences, reference); + celixThreadMutex_unlock(&entry->mutex); + if (removed) { + serviceRegistry_ungetServiceReference(framework->registry, entry->bundle, reference); // decrease retain counter } - free(event); + } - } else if (eventType == OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED) { - bool matchResult = false; - int matched = 0; - if (element->filter != NULL) { - filter_match(element->filter, oldprops, &matchResult); - } - matched = (element->filter == NULL) || matchResult; - if (matched) { - service_reference_pt reference = NULL; - service_event_pt endmatch = (service_event_pt) malloc(sizeof (*endmatch)); + free(event); + + } else if (eventType == OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED) { + bool matchResult = false; + int matched = 0; + if (entry->filter != NULL) { + filter_match(entry->filter, oldprops, &matchResult); + } + matched = (entry->filter == NULL) || matchResult; + if (matched) { + service_reference_pt reference = NULL; + celix_service_event_t *endmatch = malloc(sizeof(*endmatch)); - serviceRegistry_getServiceReference(framework->registry, element->bundle, registration, &reference); + serviceRegistry_getServiceReference(framework->registry, entry->bundle, registration, &reference); - endmatch->reference = reference; - endmatch->type = OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED_ENDMATCH; - element->listener->serviceChanged(element->listener, endmatch); + endmatch->reference = reference; + endmatch->type = OSGI_FRAMEWORK_SERVICE_EVENT_MODIFIED_ENDMATCH; + entry->listener->serviceChanged(entry->listener, endmatch); - serviceRegistry_ungetServiceReference(framework->registry, element->bundle, reference); - free(endmatch); + serviceRegistry_ungetServiceReference(framework->registry, entry->bundle, reference); + free(endmatch); - } } } + listener_release(framework, entry); //decrease usage, so that the listener can be destroyed (if use count is now 0) } - celixThreadMutex_unlock(&framework->serviceListenersLock); - + celix_arrayList_destroy(copy); } //celix_status_t fw_isServiceAssignable(framework_pt fw, bundle_pt requester, service_reference_pt reference, bool *assignable) { @@ -2781,7 +2817,7 @@ service_registration_t* celix_framework_registerServiceFactory(framework_t *fw , const char* celix_framework_getUUID(const celix_framework_t *fw) { if (fw != NULL) { - return celix_properties_get(fw->configurationMap, OSGI_FRAMEWORK_FRAMEWORK_UUID); + return celix_properties_get(fw->configurationMap, OSGI_FRAMEWORK_FRAMEWORK_UUID, NULL); } return NULL; } http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/src/framework_private.h ---------------------------------------------------------------------- diff --git a/libs/framework/src/framework_private.h b/libs/framework/src/framework_private.h index dcfe75f..6adb402 100644 --- a/libs/framework/src/framework_private.h +++ b/libs/framework/src/framework_private.h @@ -16,14 +16,6 @@ *specific language governing permissions and limitations *under the License. */ -/* - * framework_private.h - * - * \date May 22, 2013 - * \author <a href="mailto:[email protected]">Apache Celix Project Team</a> - * \copyright Apache License, Version 2.0 - */ - #ifndef FRAMEWORK_PRIVATE_H_ #define FRAMEWORK_PRIVATE_H_ @@ -38,7 +30,7 @@ #include "celix_errno.h" #include "service_factory.h" #include "bundle_archive.h" -#include "service_listener.h" +#include "celix_service_listener.h" #include "bundle_listener.h" #include "framework_listener.h" #include "service_registration.h" @@ -47,6 +39,7 @@ #include "celix_log.h" #include "celix_threads.h" +#include "service_registry.h" struct framework { #ifdef WITH_APR @@ -117,8 +110,8 @@ FRAMEWORK_EXPORT celix_status_t framework_ungetService(framework_pt framework, b FRAMEWORK_EXPORT celix_status_t fw_getBundleRegisteredServices(framework_pt framework, bundle_pt bundle, array_list_pt *services); FRAMEWORK_EXPORT celix_status_t fw_getBundleServicesInUse(framework_pt framework, bundle_pt bundle, array_list_pt *services); -FRAMEWORK_EXPORT void fw_addServiceListener(framework_pt framework, bundle_pt bundle, service_listener_pt listener, const char* filter); -FRAMEWORK_EXPORT void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, service_listener_pt listener); +FRAMEWORK_EXPORT void fw_addServiceListener(framework_pt framework, bundle_pt bundle, celix_service_listener_t *listener, const char* filter); +FRAMEWORK_EXPORT void fw_removeServiceListener(framework_pt framework, bundle_pt bundle, celix_service_listener_t *listener); FRAMEWORK_EXPORT celix_status_t fw_addBundleListener(framework_pt framework, bundle_pt bundle, bundle_listener_pt listener); FRAMEWORK_EXPORT celix_status_t fw_removeBundleListener(framework_pt framework, bundle_pt bundle, bundle_listener_pt listener); @@ -126,7 +119,7 @@ FRAMEWORK_EXPORT celix_status_t fw_removeBundleListener(framework_pt framework, FRAMEWORK_EXPORT celix_status_t fw_addFrameworkListener(framework_pt framework, bundle_pt bundle, framework_listener_pt listener); FRAMEWORK_EXPORT celix_status_t fw_removeFrameworkListener(framework_pt framework, bundle_pt bundle, framework_listener_pt listener); -FRAMEWORK_EXPORT void fw_serviceChanged(framework_pt framework, service_event_type_e eventType, service_registration_pt registration, properties_pt oldprops); +FRAMEWORK_EXPORT void fw_serviceChanged(framework_pt framework, celix_service_event_type_t eventType, service_registration_pt registration, properties_pt oldprops); FRAMEWORK_EXPORT celix_status_t fw_isServiceAssignable(framework_pt fw, bundle_pt requester, service_reference_pt reference, bool* assignable); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/src/service_tracker.c ---------------------------------------------------------------------- diff --git a/libs/framework/src/service_tracker.c b/libs/framework/src/service_tracker.c index e718874..4d7798c 100644 --- a/libs/framework/src/service_tracker.c +++ b/libs/framework/src/service_tracker.c @@ -32,16 +32,47 @@ #include "bundle_context_private.h" #include "celix_array_list.h" -static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_reference_pt reference, service_event_pt event); -static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service_reference_pt reference, service_event_pt event); +static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_reference_pt reference, celix_service_event_t *event); +static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service_reference_pt reference, celix_service_event_t *event); static void serviceTracker_untrackTracked(celix_service_tracker_t *tracker, celix_tracked_entry_t *tracked); static celix_status_t serviceTracker_invokeAddingService(celix_service_tracker_t *tracker, service_reference_pt ref, void **svcOut); static celix_status_t serviceTracker_invokeAddService(celix_service_tracker_t *tracker, celix_tracked_entry_t *tracked); static celix_status_t serviceTracker_invokeModifiedService(celix_service_tracker_t *tracker, celix_tracked_entry_t *tracked); static celix_status_t serviceTracker_invokeRemovingService(celix_service_tracker_t *tracker, celix_tracked_entry_t *tracked); static void serviceTracker_checkAndInvokeSetService(void *handle, void *highestSvc, const properties_t *props, const bundle_t *bnd); -static inline void tracked_increaseUse(celix_tracked_entry_t *tracked); -static inline void tracked_decreaseUse(celix_tracked_entry_t *tracked); + +static inline celix_tracked_entry_t* tracked_create(service_reference_pt ref, void *svc, celix_properties_t *props, celix_bundle_t *bnd) { + celix_tracked_entry_t *tracked = calloc(1, sizeof(*tracked)); + + tracked->reference = ref; + tracked->service = svc; + tracked->properties = props; + tracked->serviceOwner = bnd; + tracked->serviceName = celix_properties_get(props, OSGI_FRAMEWORK_OBJECTCLASS, "Error"); + + tracked->useCount = 1; + celixThreadMutex_create(&tracked->mutex, NULL); + return tracked; +} + +static inline void tracked_retain(celix_tracked_entry_t *tracked) { + celixThreadMutex_lock(&tracked->mutex); + tracked->useCount += 1; + celixThreadMutex_unlock(&tracked->mutex); +} + +static inline void tracked_release(celix_tracked_entry_t *tracked) { + celixThreadMutex_lock(&tracked->mutex); + tracked->useCount -= 1; + size_t count = tracked->useCount; + celixThreadMutex_unlock(&tracked->mutex); + + if (count == 0) { + //destroy + celixThreadMutex_destroy(&tracked->mutex); + free(tracked); + } +} celix_status_t serviceTracker_create(bundle_context_pt context, const char * service, service_tracker_customizer_pt customizer, service_tracker_pt *tracker) { celix_status_t status = CELIX_SUCCESS; @@ -111,10 +142,10 @@ celix_status_t serviceTracker_destroy(service_tracker_pt tracker) { } celix_status_t serviceTracker_open(service_tracker_pt tracker) { - service_listener_pt listener; + celix_service_listener_t *listener; array_list_pt initial = NULL; celix_status_t status = CELIX_SUCCESS; - listener = (service_listener_pt) malloc(sizeof(*listener)); + listener = (celix_service_listener_t *) malloc(sizeof(*listener)); status = bundleContext_getServiceReferences(tracker->context, NULL, tracker->filter, &initial); //REF COUNT to 1 if (status == CELIX_SUCCESS && listener != NULL) { @@ -262,7 +293,7 @@ void *serviceTracker_getServiceByReference(service_tracker_pt tracker, service_r return service; } -void serviceTracker_serviceChanged(service_listener_pt listener, service_event_pt event) { +void serviceTracker_serviceChanged(celix_service_listener_t *listener, celix_service_event_t *event) { service_tracker_pt tracker = listener->handle; switch (event->type) { case OSGI_FRAMEWORK_SERVICE_EVENT_REGISTERED: @@ -280,7 +311,7 @@ void serviceTracker_serviceChanged(service_listener_pt listener, service_event_p } } -static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_reference_pt reference, service_event_pt event) { +static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_reference_pt reference, celix_service_event_t *event) { celix_status_t status = CELIX_SUCCESS; celix_tracked_entry_t *found = NULL; @@ -295,7 +326,7 @@ static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_r serviceReference_equals(reference, visit->reference, &equals); if (equals) { found = visit; - tracked_increaseUse(found); + tracked_retain(found); break; } } @@ -303,30 +334,25 @@ static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_r if (found != NULL) { status = serviceTracker_invokeModifiedService(tracker, found); - tracked_decreaseUse(found); + tracked_retain(found); } else if (status == CELIX_SUCCESS && found == NULL) { + //NEW entry void *service = NULL; status = serviceTracker_invokeAddingService(tracker, reference, &service); if (status == CELIX_SUCCESS && service != NULL) { - celix_tracked_entry_t *tracked = (celix_tracked_entry_t*) calloc(1, sizeof (*tracked)); assert(reference != NULL); - tracked->reference = reference; - tracked->service = service; + service_registration_t *reg = NULL; properties_t *props = NULL; bundle_t *bnd = NULL; - serviceReference_getProperty(reference, OSGI_FRAMEWORK_OBJECTCLASS, &tracked->serviceName); + serviceReference_getBundle(reference, &bnd); serviceReference_getServiceRegistration(reference, ®); if (reg != NULL) { serviceRegistration_getProperties(reg, &props); } - tracked->properties = props; - tracked->serviceOwner = bnd; - tracked->useCount = 1; //invoke add - celixThreadMutex_create(&tracked->mutex, NULL); - celixThreadCondition_init(&tracked->useCond, NULL); + celix_tracked_entry_t *tracked = tracked_create(reference, service, props, bnd); celixThreadRwlock_writeLock(&tracker->lock); arrayList_add(tracker->trackedServices, tracked); @@ -334,7 +360,6 @@ static celix_status_t serviceTracker_track(service_tracker_pt tracker, service_r serviceTracker_invokeAddService(tracker, tracked); celix_serviceTracker_useHighestRankingService(tracker, tracked->serviceName, tracker, NULL, NULL, serviceTracker_checkAndInvokeSetService); - tracked_decreaseUse(tracked); } } @@ -455,7 +480,7 @@ static celix_status_t serviceTracker_invokeAddingService(celix_service_tracker_t return status; } -static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service_reference_pt reference, service_event_pt event) { +static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service_reference_pt reference, celix_service_event_t *event) { celix_status_t status = CELIX_SUCCESS; celix_tracked_entry_t *remove = NULL; unsigned int i; @@ -479,13 +504,14 @@ static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service size = arrayList_size(tracker->trackedServices); //updated size celixThreadRwlock_unlock(&tracker->lock); - serviceTracker_untrackTracked(tracker, remove); if (size == 0) { serviceTracker_checkAndInvokeSetService(tracker, NULL, NULL, NULL); } else { celix_serviceTracker_useHighestRankingService(tracker, serviceName, tracker, NULL, NULL, serviceTracker_checkAndInvokeSetService); } + serviceTracker_untrackTracked(tracker, remove); + framework_logIfError(logger, status, NULL, "Cannot untrack reference"); return status; @@ -494,19 +520,8 @@ static celix_status_t serviceTracker_untrack(service_tracker_pt tracker, service static void serviceTracker_untrackTracked(celix_service_tracker_t *tracker, celix_tracked_entry_t *tracked) { if (tracked != NULL) { serviceTracker_invokeRemovingService(tracker, tracked); - celixThreadMutex_lock(&tracked->mutex); - while (tracked->useCount > 0) { - celixThreadCondition_wait(&tracked->useCond, &tracked->mutex); - } - celixThreadMutex_unlock(&tracked->mutex); - - //use count == 0, tracked entry is removed from trackedServices so there is no way it can be used again -> - //safe to destroy. - bundleContext_ungetServiceReference(tracker->context, tracked->reference); - celixThreadMutex_destroy(&tracked->mutex); - celixThreadCondition_destroy(&tracked->useCond); - free(tracked); + tracked_release(tracked); } } @@ -665,7 +680,7 @@ bool celix_serviceTracker_useHighestRankingService( } if (highest != NULL) { //highest found lock tracked entry and increase use count - tracked_increaseUse(highest); + tracked_retain(highest); } //unlock tracker so that the tracked entry can be removed from the trackedServices list if unregistered. celixThreadRwlock_unlock(&tracker->lock); @@ -682,7 +697,7 @@ bool celix_serviceTracker_useHighestRankingService( useWithOwner(callbackHandle, highest->service, highest->properties, highest->serviceOwner); } called = true; - tracked_decreaseUse(highest); + tracked_release(highest); } return called; @@ -703,7 +718,7 @@ void celix_serviceTracker_useServices( celix_tracked_entry_t* entries[size]; for (i = 0; i < size; i++) { celix_tracked_entry_t *tracked = (celix_tracked_entry_t *) arrayList_get(tracker->trackedServices, i); - tracked_increaseUse(tracked); + tracked_retain(tracked); entries[i] = tracked; } //unlock tracker so that the tracked entry can be removed from the trackedServices list if unregistered. @@ -723,21 +738,6 @@ void celix_serviceTracker_useServices( useWithOwner(callbackHandle, entry->service, entry->properties, entry->serviceOwner); } - tracked_decreaseUse(entry); + tracked_release(entry); } -} - -static inline void tracked_increaseUse(celix_tracked_entry_t *tracked) { - celixThreadMutex_lock(&tracked->mutex); - tracked->useCount += 1; - celixThreadMutex_unlock(&tracked->mutex); -} - -static inline void tracked_decreaseUse(celix_tracked_entry_t *tracked) { - celixThreadMutex_lock(&tracked->mutex); - tracked->useCount -= 1; - if (tracked->useCount == 0) { - celixThreadCondition_signal(&tracked->useCond); - } - celixThreadMutex_unlock(&tracked->mutex); } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/src/service_tracker_private.h ---------------------------------------------------------------------- diff --git a/libs/framework/src/service_tracker_private.h b/libs/framework/src/service_tracker_private.h index b5c3abb..eccda39 100644 --- a/libs/framework/src/service_tracker_private.h +++ b/libs/framework/src/service_tracker_private.h @@ -35,7 +35,7 @@ struct celix_serviceTracker { char * filter; service_tracker_customizer_t *customizer; - service_listener_pt listener; + celix_service_listener_t *listener; void *callbackHandle; @@ -68,7 +68,6 @@ struct celix_tracked_entry { properties_t *properties; bundle_t *serviceOwner; - celix_thread_cond_t useCond; //condition for useCount == 0 celix_thread_mutex_t mutex; //protects useCount size_t useCount; }; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/framework/tst/bundle_context_services_test.cpp ---------------------------------------------------------------------- diff --git a/libs/framework/tst/bundle_context_services_test.cpp b/libs/framework/tst/bundle_context_services_test.cpp index eb46351..5e1792a 100644 --- a/libs/framework/tst/bundle_context_services_test.cpp +++ b/libs/framework/tst/bundle_context_services_test.cpp @@ -346,13 +346,13 @@ TEST(CelixBundleContextServicesTests, servicesTrackerTestWithProperties) { int count = 0; auto add = [](void *handle, void *svc, const properties_t *props) { CHECK(svc != NULL); - STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE)); + STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, NULL)); int *c = static_cast<int*>(handle); *c += 1; }; auto remove = [](void *handle, void *svc, const properties_t *props) { CHECK(svc != NULL); - STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE)); + STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, NULL)); int *c = static_cast<int*>(handle); *c -= 1; }; @@ -384,14 +384,14 @@ TEST(CelixBundleContextServicesTests, servicesTrackerTestWithOwner) { int count = 0; auto add = [](void *handle, void *svc, const properties_t *props, const bundle_t *svcOwner) { CHECK(svc != NULL); - STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE)); + STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, NULL)); CHECK(celix_bundle_getId(svcOwner) >= 0); int *c = static_cast<int*>(handle); *c += 1; }; auto remove = [](void *handle, void *svc, const properties_t *props, const bundle_t *svcOwner) { CHECK(svc != NULL); - STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE)); + STRCMP_EQUAL("C", celix_properties_get(props, CELIX_FRAMEWORK_SERVICE_LANGUAGE, NULL)); CHECK(celix_bundle_getId(svcOwner) >= 0); int *c = static_cast<int*>(handle); *c -= 1; http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/utils/include/celix_properties.h ---------------------------------------------------------------------- diff --git a/libs/utils/include/celix_properties.h b/libs/utils/include/celix_properties.h index fcb2aec..8a547d0 100644 --- a/libs/utils/include/celix_properties.h +++ b/libs/utils/include/celix_properties.h @@ -51,9 +51,7 @@ celix_properties_t* celix_properties_loadFromString(const char *input); void celix_properties_store(celix_properties_t *properties, const char *file, const char *header); -const char* celix_properties_get(const celix_properties_t *properties, const char *key); - -const char* celix_properties_getWithDefault(const celix_properties_t *properties, const char *key, const char *defaultValue); +const char* celix_properties_get(const celix_properties_t *properties, const char *key, const char *defaultValue); void celix_properties_set(celix_properties_t *properties, const char *key, const char *value); http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/utils/src/filter.c ---------------------------------------------------------------------- diff --git a/libs/utils/src/filter.c b/libs/utils/src/filter.c index 7cfa218..1218f31 100644 --- a/libs/utils/src/filter.c +++ b/libs/utils/src/filter.c @@ -634,12 +634,12 @@ bool celix_filter_match(const celix_filter_t *filter, const celix_properties_t* case CELIX_FILTER_OPERAND_LESS : case CELIX_FILTER_OPERAND_LESSEQUAL : case CELIX_FILTER_OPERAND_APPROX : { - char * value = (properties == NULL) ? NULL: (char*)celix_properties_get(properties, filter->attribute); + char * value = (properties == NULL) ? NULL: (char*)celix_properties_get(properties, filter->attribute, NULL); filter_compare(filter, value, &result); return result; } case CELIX_FILTER_OPERAND_PRESENT: { - char * value = (properties == NULL) ? NULL: (char*)celix_properties_get(properties, filter->attribute); + char * value = (properties == NULL) ? NULL: (char*)celix_properties_get(properties, filter->attribute, NULL); return value != NULL; } } http://git-wip-us.apache.org/repos/asf/celix/blob/d1803163/libs/utils/src/properties.c ---------------------------------------------------------------------- diff --git a/libs/utils/src/properties.c b/libs/utils/src/properties.c index c8b59a2..0160adb 100644 --- a/libs/utils/src/properties.c +++ b/libs/utils/src/properties.c @@ -71,11 +71,11 @@ celix_status_t properties_copy(properties_pt properties, properties_pt *out) { } const char* properties_get(properties_pt properties, const char* key) { - return celix_properties_get(properties, key); + return celix_properties_get(properties, key, NULL); } const char* properties_getWithDefault(properties_pt properties, const char* key, const char* defaultValue) { - return celix_properties_getWithDefault(properties, key, defaultValue); + return celix_properties_get(properties, key, defaultValue); } void properties_set(properties_pt properties, const char* key, const char* value) { @@ -354,12 +354,8 @@ celix_properties_t* celix_properties_copy(celix_properties_t *properties) { return copy; } -const char* celix_properties_get(const celix_properties_t *properties, const char *key) { - return hashMap_get((hash_map_t*)properties, (void*)key); -} - -const char* celix_properties_getWithDefault(const celix_properties_t *properties, const char *key, const char *defaultValue) { - const char* value = celix_properties_get(properties, key); +const char* celix_properties_get(const celix_properties_t *properties, const char *key, const char *defaultValue) { + const char* value = hashMap_get((hash_map_t*)properties, (void*)key); return value == NULL ? defaultValue : value; } @@ -383,7 +379,7 @@ void celix_properties_unset(celix_properties_t *properties, const char *key) { long celix_properties_getAsLong(const celix_properties_t *props, const char *key, long defaultValue) { long result = defaultValue; - const char *val = celix_properties_get(props, key); + const char *val = celix_properties_get(props, key, NULL); if (val != NULL) { long r = strtol(val, NULL, 10); if (errno == 0) {
