Author: bpetri
Date: Fri Dec  5 10:08:22 2014
New Revision: 1643222

URL: http://svn.apache.org/viewvc?rev=1643222&view=rev
Log:
CELIX-192: add locking, fixed minor issues in export- and import-registration 

Modified:
    
celix/trunk/remote_services/remote_service_admin/public/include/remote_endpoint_impl.h
    celix/trunk/remote_services/remote_service_admin_http/CMakeLists.txt
    
celix/trunk/remote_services/remote_service_admin_http/private/include/remote_service_admin_http_impl.h
    
celix/trunk/remote_services/remote_service_admin_http/private/src/export_registration_impl.c
    
celix/trunk/remote_services/remote_service_admin_http/private/src/import_registration_impl.c
    
celix/trunk/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c

Modified: 
celix/trunk/remote_services/remote_service_admin/public/include/remote_endpoint_impl.h
URL: 
http://svn.apache.org/viewvc/celix/trunk/remote_services/remote_service_admin/public/include/remote_endpoint_impl.h?rev=1643222&r1=1643221&r2=1643222&view=diff
==============================================================================
--- 
celix/trunk/remote_services/remote_service_admin/public/include/remote_endpoint_impl.h
 (original)
+++ 
celix/trunk/remote_services/remote_service_admin/public/include/remote_endpoint_impl.h
 Fri Dec  5 10:08:22 2014
@@ -28,10 +28,11 @@
 #define REMOTE_ENDPOINT_IMPL_H_
 
 #include "remote_endpoint.h"
+#include "celix_threads.h"
 
 struct remote_endpoint {
+       celix_thread_mutex_t serviceLock;
        void *service;
-//     apr_pool_t* pool;
 };
 
 #endif /* REMOTE_ENDPOINT_IMPL_H_ */

Modified: celix/trunk/remote_services/remote_service_admin_http/CMakeLists.txt
URL: 
http://svn.apache.org/viewvc/celix/trunk/remote_services/remote_service_admin_http/CMakeLists.txt?rev=1643222&r1=1643221&r2=1643222&view=diff
==============================================================================
--- celix/trunk/remote_services/remote_service_admin_http/CMakeLists.txt 
(original)
+++ celix/trunk/remote_services/remote_service_admin_http/CMakeLists.txt Fri 
Dec  5 10:08:22 2014
@@ -18,6 +18,7 @@
 find_package(APR REQUIRED)
 find_package(CURL REQUIRED)
 
+
 include_directories(${CURL_INCLUDE_DIRS})
 include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
 include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
@@ -43,4 +44,4 @@ bundle(remote_service_admin_http SOURCES
 
 install_bundle(remote_service_admin_http)
     
-target_link_libraries(remote_service_admin_http celix_framework 
${APRUTIL_LIBRARY} ${CURL_LIBRARIES})
+target_link_libraries(remote_service_admin_http celix_framework  
${APRUTIL_LIBRARY} ${CURL_LIBRARIES})

Modified: 
celix/trunk/remote_services/remote_service_admin_http/private/include/remote_service_admin_http_impl.h
URL: 
http://svn.apache.org/viewvc/celix/trunk/remote_services/remote_service_admin_http/private/include/remote_service_admin_http_impl.h?rev=1643222&r1=1643221&r2=1643222&view=diff
==============================================================================
--- 
celix/trunk/remote_services/remote_service_admin_http/private/include/remote_service_admin_http_impl.h
 (original)
+++ 
celix/trunk/remote_services/remote_service_admin_http/private/include/remote_service_admin_http_impl.h
 Fri Dec  5 10:08:22 2014
@@ -36,7 +36,10 @@ struct remote_service_admin {
        bundle_context_pt context;
        log_helper_pt loghelper;
 
+       celix_thread_mutex_t exportedServicesLock;
        hash_map_pt exportedServices;
+
+       celix_thread_mutex_t importedServicesLock;
        hash_map_pt importedServices;
 
        char *port;

Modified: 
celix/trunk/remote_services/remote_service_admin_http/private/src/export_registration_impl.c
URL: 
http://svn.apache.org/viewvc/celix/trunk/remote_services/remote_service_admin_http/private/src/export_registration_impl.c?rev=1643222&r1=1643221&r2=1643222&view=diff
==============================================================================
--- 
celix/trunk/remote_services/remote_service_admin_http/private/src/export_registration_impl.c
 (original)
+++ 
celix/trunk/remote_services/remote_service_admin_http/private/src/export_registration_impl.c
 Fri Dec  5 10:08:22 2014
@@ -158,6 +158,7 @@ celix_status_t exportRegistration_endpoi
 
        remote_endpoint_service_pt endpoint = service;
        if (registration->endpoint != NULL) {
+               remoteServiceAdmin_removeExportedService(registration);
                registration->endpoint = NULL;
                endpoint->setService(endpoint->endpoint, NULL);
        }

Modified: 
celix/trunk/remote_services/remote_service_admin_http/private/src/import_registration_impl.c
URL: 
http://svn.apache.org/viewvc/celix/trunk/remote_services/remote_service_admin_http/private/src/import_registration_impl.c?rev=1643222&r1=1643221&r2=1643222&view=diff
==============================================================================
--- 
celix/trunk/remote_services/remote_service_admin_http/private/src/import_registration_impl.c
 (original)
+++ 
celix/trunk/remote_services/remote_service_admin_http/private/src/import_registration_impl.c
 Fri Dec  5 10:08:22 2014
@@ -229,8 +229,8 @@ celix_status_t importRegistrationFactory
                // check whether factory is available
                if (((*registration_factory)->trackedFactory == NULL) && 
((status = importRegistrationFactory_open(*registration_factory)) != 
CELIX_SUCCESS)) {
                        logHelper_log((*registration_factory)->loghelper, 
OSGI_LOGSERVICE_ERROR, "remoteServiceAdmin_importService: cannot open 
registration_factory for %s.", serviceName);
-                       importRegistrationFactory_destroy(registration_factory);
                        
serviceTracker_close((*registration_factory)->proxyFactoryTracker);
+                       importRegistrationFactory_destroy(registration_factory);
                }
        }
 

Modified: 
celix/trunk/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
URL: 
http://svn.apache.org/viewvc/celix/trunk/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c?rev=1643222&r1=1643221&r2=1643222&view=diff
==============================================================================
--- 
celix/trunk/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
 (original)
+++ 
celix/trunk/remote_services/remote_service_admin_http/private/src/remote_service_admin_impl.c
 Fri Dec  5 10:08:22 2014
@@ -53,7 +53,7 @@
 #include "service_registration.h"
 #include "log_helper.h"
 #include "log_service.h"
-
+#include "celix_threads.h"
 
 // defines how often the webserver is restarted (with an increased port number)
 #define MAX_NUMBER_OF_RESTARTS         5
@@ -112,6 +112,9 @@ celix_status_t remoteServiceAdmin_create
                (*admin)->exportedServices = hashMap_create(NULL, NULL, NULL, 
NULL);
                (*admin)->importedServices = hashMap_create(NULL, NULL, NULL, 
NULL);
 
+               celixThreadMutex_create(&(*admin)->exportedServicesLock, NULL);
+               celixThreadMutex_create(&(*admin)->importedServicesLock, NULL);
+
                if (logHelper_create(context, &(*admin)->loghelper) == 
CELIX_SUCCESS) {
                        logHelper_start((*admin)->loghelper);
                }
@@ -201,6 +204,9 @@ celix_status_t remoteServiceAdmin_stop(r
                }
        }
     hashMapIterator_destroy(iter);
+
+    celixThreadMutex_lock(&admin->importedServicesLock);
+
     iter = hashMapIterator_create(admin->importedServices);
     while (hashMapIterator_hasNext(iter))
     {
@@ -220,6 +226,7 @@ celix_status_t remoteServiceAdmin_stop(r
         importRegistrationFactory_close(importFactory);
     }
     hashMapIterator_destroy(iter);
+    celixThreadMutex_unlock(&admin->importedServicesLock);
 
        if (admin->ctx != NULL) {
                logHelper_log(admin->loghelper, OSGI_LOGSERVICE_INFO, "RSA: 
Stopping webserver...");
@@ -245,10 +252,13 @@ static int remoteServiceAdmin_callback(s
        if (request_info->uri != NULL) {
                remote_service_admin_pt rsa = request_info->user_data;
 
+
                if (strncmp(request_info->uri, "/service/", 9) == 0 && 
strcmp("POST", request_info->request_method) == 0) {
+
                        // uri = /services/myservice/call
                        const char *uri = request_info->uri;
                        // rest = myservice/call
+
                        const char *rest = uri+9;
                        char *interfaceStart = strchr(rest, '/');
                        int pos = interfaceStart - rest;
@@ -256,6 +266,8 @@ static int remoteServiceAdmin_callback(s
                        strncpy(service, rest, pos);
                        service[pos] = '\0';
 
+                       celixThreadMutex_lock(&rsa->exportedServicesLock);
+
                        hash_map_iterator_pt iter = 
hashMapIterator_create(rsa->exportedServices);
                        while (hashMapIterator_hasNext(iter)) {
                                hash_map_entry_pt entry = 
hashMapIterator_nextEntry(iter);
@@ -287,6 +299,8 @@ static int remoteServiceAdmin_callback(s
                                        }
                                }
                        }
+                       celixThreadMutex_unlock(&rsa->exportedServicesLock);
+
             hashMapIterator_destroy(iter);
                }
        }
@@ -295,6 +309,8 @@ static int remoteServiceAdmin_callback(s
 }
 
 celix_status_t remoteServiceAdmin_handleRequest(remote_service_admin_pt rsa, 
char *service, char *data, char **reply) {
+       celixThreadMutex_lock(&rsa->exportedServicesLock);
+
        hash_map_iterator_pt iter = 
hashMapIterator_create(rsa->exportedServices);
        while (hashMapIterator_hasNext(iter)) {
                hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
@@ -308,6 +324,9 @@ celix_status_t remoteServiceAdmin_handle
                }
        }
     hashMapIterator_destroy(iter);
+
+       celixThreadMutex_unlock(&rsa->exportedServicesLock);
+
        return CELIX_SUCCESS;
 }
 
@@ -387,7 +406,10 @@ celix_status_t remoteServiceAdmin_export
                                exportRegistration_open(registration);
                                exportRegistration_startTracking(registration);
                        }
+                       celixThreadMutex_lock(&admin->exportedServicesLock);
                        hashMap_put(admin->exportedServices, reference, 
*registrations);
+                       celixThreadMutex_unlock(&admin->exportedServicesLock);
+
                }
                arrayList_destroy(interfaces);
        }
@@ -399,7 +421,10 @@ celix_status_t remoteServiceAdmin_remove
     celix_status_t status = CELIX_SUCCESS;
     remote_service_admin_pt admin = registration->rsa;
 
+    celixThreadMutex_lock(&admin->exportedServicesLock);
+
     hashMap_remove(admin->exportedServices, registration->reference);
+    celixThreadMutex_unlock(&admin->exportedServicesLock);
 
     return status;
 }
@@ -408,6 +433,7 @@ celix_status_t remoteServiceAdmin_instal
        celix_status_t status = CELIX_SUCCESS;
        properties_pt endpointProperties = properties_create();
 
+
        unsigned int size = 0;
     char **keys;
 
@@ -520,6 +546,8 @@ celix_status_t remoteServiceAdmin_import
 
        logHelper_log(admin->loghelper, OSGI_LOGSERVICE_INFO, "RSA: Import 
service %s", endpointDescription->service);
 
+       celixThreadMutex_lock(&admin->importedServicesLock);
+
    import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) hashMap_get(admin->importedServices, 
endpointDescription->service);
 
        // check whether we already have a registration_factory registered in 
the hashmap
@@ -545,6 +573,9 @@ celix_status_t remoteServiceAdmin_import
                arrayList_add(registration_factory->registrations, 
*registration);
        }
 
+    celixThreadMutex_unlock(&admin->importedServicesLock);
+
+
        return status;
 }
 
@@ -552,7 +583,11 @@ celix_status_t remoteServiceAdmin_import
 celix_status_t 
remoteServiceAdmin_removeImportedService(remote_service_admin_pt admin, 
import_registration_pt registration) {
        celix_status_t status = CELIX_SUCCESS;
        endpoint_description_pt endpointDescription = (endpoint_description_pt) 
registration->endpointDescription;
-       import_registration_factory_pt registration_factory = 
(import_registration_factory_pt) hashMap_get(admin->importedServices, 
endpointDescription->service);
+       import_registration_factory_pt registration_factory = NULL;
+
+    celixThreadMutex_lock(&admin->importedServicesLock);
+
+    registration_factory = (import_registration_factory_pt) 
hashMap_get(admin->importedServices, endpointDescription->service);
 
     // factory available
     if ((registration_factory == NULL) || 
(registration_factory->trackedFactory == NULL))
@@ -577,6 +612,8 @@ celix_status_t remoteServiceAdmin_remove
                }
     }
 
+    celixThreadMutex_unlock(&admin->importedServicesLock);
+
        return status;
 }
 
@@ -602,6 +639,8 @@ celix_status_t remoteServiceAdmin_send(r
     if(!curl) {
         status = CELIX_ILLEGAL_STATE;
     } else {
+
+
         curl_easy_setopt(curl, CURLOPT_URL, url);
         curl_easy_setopt(curl, CURLOPT_POST, 1L);
         curl_easy_setopt(curl, CURLOPT_READFUNCTION, 
remoteServiceAdmin_readCallback);


Reply via email to