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, &registration);
        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, 
&registration);
        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;


Reply via email to