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 2013/09/17 15:21:15 UTC
svn commit: r1524033 - in /incubator/celix/trunk: framework/private/src/
framework/public/include/
remote_services/remote_service_admin/private/include/
remote_services/remote_service_admin/private/src/
remote_services/remote_service_admin/public/inclu...
Author: pnoltes
Date: Tue Sep 17 13:21:14 2013
New Revision: 1524033
URL: http://svn.apache.org/r1524033
Log:
CELIX-82: fixed segfault bug with respect to wrong service reference usage.
Modified:
incubator/celix/trunk/framework/private/src/service_reference.c
incubator/celix/trunk/framework/public/include/service_reference.h
incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
incubator/celix/trunk/remote_services/remote_service_admin/public/include/remote_service_admin.h
incubator/celix/trunk/remote_services/topology_manager/private/include/topology_manager.h
incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c
incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c
Modified: incubator/celix/trunk/framework/private/src/service_reference.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/private/src/service_reference.c?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/framework/private/src/service_reference.c (original)
+++ incubator/celix/trunk/framework/private/src/service_reference.c Tue Sep 17 13:21:14 2013
@@ -78,6 +78,11 @@ celix_status_t serviceReference_invalida
return CELIX_SUCCESS;
}
+celix_status_t serviceRefernce_isValid(service_reference_pt reference, bool *result) {
+ (*result) = reference->registration != NULL;
+ return CELIX_SUCCESS;
+}
+
bool serviceReference_isAssignableTo(service_reference_pt reference, bundle_pt requester, char * serviceName) {
bool allow = true;
Modified: incubator/celix/trunk/framework/public/include/service_reference.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/framework/public/include/service_reference.h?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/framework/public/include/service_reference.h (original)
+++ incubator/celix/trunk/framework/public/include/service_reference.h Tue Sep 17 13:21:14 2013
@@ -38,6 +38,7 @@ typedef struct serviceReference * servic
celix_status_t serviceReference_create(apr_pool_t *pool, bundle_pt bundle, service_registration_pt registration, service_reference_pt *reference);
FRAMEWORK_EXPORT celix_status_t serviceReference_invalidate(service_reference_pt reference);
+FRAMEWORK_EXPORT celix_status_t serviceRefernce_isValid(service_reference_pt reference, bool *result);
FRAMEWORK_EXPORT celix_status_t serviceReference_getServiceRegistration(service_reference_pt reference, service_registration_pt *registration);
FRAMEWORK_EXPORT celix_status_t serviceReference_getBundle(service_reference_pt reference, bundle_pt *bundle);
Modified: incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/private/include/remote_service_admin_impl.h Tue Sep 17 13:21:14 2013
@@ -58,7 +58,7 @@ struct remote_service_admin {
celix_status_t remoteServiceAdmin_create(apr_pool_t *pool, bundle_context_pt context, remote_service_admin_pt *admin);
celix_status_t remoteServiceAdmin_stop(remote_service_admin_pt admin);
-celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, service_reference_pt reference, properties_pt properties, array_list_pt *registrations);
+celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations);
celix_status_t remoteServiceAdmin_getExportedServices(remote_service_admin_pt admin, array_list_pt *services);
celix_status_t remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt admin, array_list_pt *services);
celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, endpoint_description_pt endpoint, import_registration_pt *registration);
Modified: incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c Tue Sep 17 13:21:14 2013
@@ -69,7 +69,7 @@ celix_status_t remoteServiceAdmin_create
char *port = NULL;
bundleContext_getProperty(context, "RSA_PORT", &port);
if (port == NULL) {
- (*admin)->port = DEFAULT_PORT;
+ (*admin)->port = (char *)DEFAULT_PORT;
} else {
(*admin)->port = apr_pstrdup(pool, port);
}
@@ -173,11 +173,32 @@ celix_status_t remoteServiceAdmin_handle
return CELIX_SUCCESS;
}
-celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, service_reference_pt reference, properties_pt properties, array_list_pt *registrations) {
+celix_status_t remoteServiceAdmin_exportService(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations) {
celix_status_t status = CELIX_SUCCESS;
arrayList_create(admin->pool, registrations);
-
+ array_list_pt references = NULL;
+ service_reference_pt reference = NULL;
service_registration_pt registration = NULL;
+ apr_pool_t *tmpPool = NULL;
+
+ apr_pool_create(&tmpPool, admin->pool);
+ if (tmpPool == NULL) {
+ return CELIX_ENOMEM;
+ } else {
+ char *filter = apr_pstrcat(admin->pool, "(", (char *)SERVICE_ID, "=", serviceId, ")", NULL); /*FIXME memory leak*/
+ bundleContext_getServiceReferences(admin->context, NULL, filter, &references);
+ apr_pool_destroy(tmpPool);
+ if (arrayList_size(references) >= 1) {
+ reference = arrayList_get(references, 0);
+ }
+ }
+
+ if (reference == NULL) {
+ printf("ERROR: expected a reference for service id %s\n", serviceId);
+ return CELIX_ILLEGAL_STATE;
+ }
+
+
serviceReference_getServiceRegistration(reference, ®istration);
properties_pt serviceProperties = NULL;
serviceRegistration_getProperties(registration, &serviceProperties);
Modified: incubator/celix/trunk/remote_services/remote_service_admin/public/include/remote_service_admin.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/public/include/remote_service_admin.h?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/remote_service_admin/public/include/remote_service_admin.h (original)
+++ incubator/celix/trunk/remote_services/remote_service_admin/public/include/remote_service_admin.h Tue Sep 17 13:21:14 2013
@@ -40,7 +40,7 @@ typedef struct remote_service_admin *rem
struct remote_service_admin_service {
remote_service_admin_pt admin;
- celix_status_t (*exportService)(remote_service_admin_pt admin, service_reference_pt reference, properties_pt properties, array_list_pt *registrations);
+ celix_status_t (*exportService)(remote_service_admin_pt admin, char *serviceId, properties_pt properties, array_list_pt *registrations);
celix_status_t (*getExportedServices)(remote_service_admin_pt admin, array_list_pt *services);
celix_status_t (*getImportedEndpoints)(remote_service_admin_pt admin, array_list_pt *services);
celix_status_t (*importService)(remote_service_admin_pt admin, endpoint_description_pt endpoint, import_registration_pt *registration);
Modified: incubator/celix/trunk/remote_services/topology_manager/private/include/topology_manager.h
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/topology_manager/private/include/topology_manager.h?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/topology_manager/private/include/topology_manager.h (original)
+++ incubator/celix/trunk/remote_services/topology_manager/private/include/topology_manager.h Tue Sep 17 13:21:14 2013
@@ -46,8 +46,8 @@ celix_status_t topologyManager_endpointA
celix_status_t topologyManager_endpointRemoved(void *handle, endpoint_description_pt endpoint, char *machtedFilter);
celix_status_t topologyManager_importService(topology_manager_pt manager, endpoint_description_pt endpoint);
-celix_status_t topologyManager_exportService(topology_manager_pt manager, service_reference_pt reference);
-celix_status_t topologyManager_removeService(topology_manager_pt manager, service_reference_pt reference);
+celix_status_t topologyManager_exportService(topology_manager_pt manager, service_reference_pt reference, char *serviceId);
+celix_status_t topologyManager_removeService(topology_manager_pt manager, service_reference_pt reference, char *serviceId);
celix_status_t topologyManager_listenerAdded(void *handle, array_list_pt listeners);
celix_status_t topologyManager_listenerRemoved(void *handle, array_list_pt listeners);
Modified: incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c (original)
+++ incubator/celix/trunk/remote_services/topology_manager/private/src/activator.c Tue Sep 17 13:21:14 2013
@@ -151,7 +151,7 @@ celix_status_t bundleActivator_start(voi
bundleContext_registerService(context, (char *) listener_hook_service_name, hook, NULL, &activator->hook);
- bundleContext_addServiceListener(context, activator->serviceListener, NULL);
+ bundleContext_addServiceListener(context, activator->serviceListener, "(service.exported.interfaces=*)");
serviceTracker_open(activator->remoteServiceAdminTracker);
return status;
Modified: incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c
URL: http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c?rev=1524033&r1=1524032&r2=1524033&view=diff
==============================================================================
--- incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c (original)
+++ incubator/celix/trunk/remote_services/topology_manager/private/src/topology_manager.c Tue Sep 17 13:21:14 2013
@@ -118,23 +118,25 @@ celix_status_t topologyManager_rsaRemove
celix_status_t topologyManager_serviceChanged(void *listener, service_event_pt event) {
celix_status_t status = CELIX_SUCCESS;
service_listener_pt listen = listener;
+
topology_manager_pt manager = listen->handle;
service_registration_pt registration = NULL;
+ printf("found event reference %p\n", event->reference);
serviceReference_getServiceRegistration(event->reference, ®istration);
properties_pt props = NULL;
serviceRegistration_getProperties(registration, &props);
char *name = properties_get(props, (char *) OBJECTCLASS);
char *export = properties_get(props, (char *) SERVICE_EXPORTED_INTERFACES);
+ char *serviceId = properties_get(props, (char *)SERVICE_ID);
if (event->type == SERVICE_EVENT_REGISTERED) {
if (export != NULL) {
- printf("TOPOLOGY_MANAGER: Service registered: %s\n", name);
- status = topologyManager_exportService(manager, event->reference);
+ status = topologyManager_exportService(manager, event->reference, serviceId);
}
} else if (event->type == SERVICE_EVENT_UNREGISTERING) {
//if (export != NULL) {
printf("TOPOLOGY_MANAGER: Service unregistering: %s\n", name);
- status = topologyManager_removeService(manager, event->reference);
+ status = topologyManager_removeService(manager, event->reference, serviceId);
//}
}
@@ -170,7 +172,7 @@ celix_status_t topologyManager_endpointR
return status;
}
-celix_status_t topologyManager_exportService(topology_manager_pt manager, service_reference_pt reference) {
+celix_status_t topologyManager_exportService(topology_manager_pt manager, service_reference_pt reference, char *serviceId) {
celix_status_t status = CELIX_SUCCESS;
hash_map_pt exports = hashMap_create(NULL, NULL, NULL, NULL);
@@ -195,7 +197,7 @@ celix_status_t topologyManager_exportSer
remote_service_admin_service_pt rsa = arrayList_get(manager->rsaList, iter);
array_list_pt endpoints = NULL;
- status = rsa->exportService(rsa->admin, reference, NULL, &endpoints);
+ status = rsa->exportService(rsa->admin, serviceId, NULL, &endpoints);
if (status == CELIX_SUCCESS) {
hashMap_put(exports, rsa, endpoints);
status = topologyManager_notifyListeners(manager, rsa, endpoints);
@@ -275,7 +277,7 @@ celix_status_t topologyManager_importSer
return status;
}
-celix_status_t topologyManager_removeService(topology_manager_pt manager, service_reference_pt reference) {
+celix_status_t topologyManager_removeService(topology_manager_pt manager, service_reference_pt reference, char *serviceId) {
celix_status_t status = CELIX_SUCCESS;
service_registration_pt registration = NULL;