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, ®);
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