You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2018/07/10 15:41:37 UTC

[1/2] celix git commit: CELIX-452: Add the usage of retain/release concept in the framework.c so that serviceListeners lock can be kept local.

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 <pe...@gmail.com>
Authored: Tue Jul 10 17:35:41 2018 +0200
Committer: Pepijn Noltes <pe...@gmail.com>
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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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:dev@celix.apache.org">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, &reg);
             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) {


[2/2] celix git commit: CELIX-451: Removes warnings for the civetweb compilation

Posted by pn...@apache.org.
CELIX-451: Removes warnings for the civetweb compilation


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

Branch: refs/heads/develop
Commit: ab369697109f82ff3157fdae2364c14a122ea642
Parents: d180316
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Tue Jul 10 17:41:11 2018 +0200
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Tue Jul 10 17:41:11 2018 +0200

----------------------------------------------------------------------
 examples/celix-examples/civetweb/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/celix/blob/ab369697/examples/celix-examples/civetweb/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/examples/celix-examples/civetweb/CMakeLists.txt b/examples/celix-examples/civetweb/CMakeLists.txt
index 5e469aa..5da81b5 100644
--- a/examples/celix-examples/civetweb/CMakeLists.txt
+++ b/examples/celix-examples/civetweb/CMakeLists.txt
@@ -19,7 +19,7 @@ add_library(civetweb_static STATIC
         civetweb/civetweb.c
 )
 target_include_directories(civetweb_static PUBLIC SYSTEM civetweb)
-target_compile_options(civetweb_static PRIVATE -Wno-format -Wno-implicit-function-declaration -DUSE_WEBSOCKET)
+target_compile_options(civetweb_static PRIVATE -w -DUSE_WEBSOCKET)
 
 add_celix_bundle(embedded_civetweb
     VERSION 1.0.0