Author: bpetri
Date: Mon Jun  9 10:35:42 2014
New Revision: 1601339

URL: http://svn.apache.org/r1601339
Log:

Align code format 


Modified:
    
incubator/celix/trunk/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c

Modified: 
incubator/celix/trunk/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c?rev=1601339&r1=1601338&r2=1601339&view=diff
==============================================================================
--- 
incubator/celix/trunk/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
 (original)
+++ 
incubator/celix/trunk/remote_services/remote_service_admin_shm/private/src/remote_service_admin_impl.c
 Mon Jun  9 10:35:42 2014
@@ -47,783 +47,748 @@
 #include "service_registration.h"
 #include "netstring.h"
 
-celix_status_t remoteServiceAdmin_installEndpoint(remote_service_admin_pt 
admin, export_registration_pt registration, service_reference_pt reference, 
char *interface);
-celix_status_t 
remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, 
properties_pt serviceProperties, properties_pt endpointProperties, char 
*interface, endpoint_description_pt *description);
+celix_status_t remoteServiceAdmin_installEndpoint(remote_service_admin_pt 
admin,
+               export_registration_pt registration, service_reference_pt 
reference,
+               char *interface);
+celix_status_t remoteServiceAdmin_createEndpointDescription(
+               remote_service_admin_pt admin, properties_pt serviceProperties,
+               properties_pt endpointProperties, char *interface,
+               endpoint_description_pt *description);
 
 celix_status_t remoteServiceAdmin_lock(int semId, int semNr);
 celix_status_t remoteServiceAdmin_unlock(int semId, int semNr);
 celix_status_t remoteServiceAdmin_wait(int semId, int semNr);
 
+celix_status_t remoteServiceAdmin_createOrAttachShm(hash_map_pt ipcSegment,
+               remote_service_admin_pt admin,
+               endpoint_description_pt endpointDescription, bool 
createIfNotFound);
+celix_status_t remoteServiceAdmin_create(apr_pool_t *pool,
+               bundle_context_pt context, remote_service_admin_pt *admin) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *admin = apr_palloc(pool, sizeof(**admin));
+       if (!*admin) {
+               status = CELIX_ENOMEM;
+       } else {
+               (*admin)->pool = pool;
+               (*admin)->context = context;
+               (*admin)->exportedServices = hashMap_create(NULL, NULL, NULL, 
NULL);
+               (*admin)->importedServices = hashMap_create(NULL, NULL, NULL, 
NULL);
+               (*admin)->exportedIpcSegment = hashMap_create(NULL, NULL, NULL, 
NULL);
+               (*admin)->importedIpcSegment = hashMap_create(NULL, NULL, NULL, 
NULL);
+               (*admin)->pollThread = hashMap_create(NULL, NULL, NULL, NULL);
+               (*admin)->pollThreadRunning = hashMap_create(NULL, NULL, NULL, 
NULL);
+       }
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_stop(remote_service_admin_pt admin) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       hash_map_iterator_pt iter = 
hashMapIterator_create(admin->importedServices);
+       while (hashMapIterator_hasNext(iter)) {
+               array_list_pt exports = hashMapIterator_nextValue(iter);
+               int i;
+               for (i = 0; i < arrayList_size(exports); i++) {
+                       import_registration_pt export = arrayList_get(exports, 
i);
+                       importRegistration_stopTracking(export);
+               }
+       }
+
+       // set stop-thread-variable
+       iter = hashMapIterator_create(admin->pollThreadRunning);
+       while (hashMapIterator_hasNext(iter)) {
+               bool *pollThreadRunning = hashMapIterator_nextValue(iter);
+               *pollThreadRunning = false;
+       }
+
+       // release lock
+       iter = hashMapIterator_create(admin->exportedIpcSegment);
+       while (hashMapIterator_hasNext(iter)) {
+               ipc_segment_pt ipc = hashMapIterator_nextValue(iter);
+               remoteServiceAdmin_unlock(ipc->semId, 0);
+       }
+
+       // wait till threads has stopped
+       iter = hashMapIterator_create(admin->pollThread);
+       while (hashMapIterator_hasNext(iter)) {
+               apr_status_t tstat;
+               apr_thread_t *pollThread = hashMapIterator_nextValue(iter);
+
+               if (pollThread != NULL) {
+                       apr_status_t stat = apr_thread_join(&tstat, pollThread);
+
+                       if (stat != APR_SUCCESS && tstat != APR_SUCCESS) {
+                               status = CELIX_BUNDLE_EXCEPTION;
+                       }
+               }
+       }
+
+       iter = hashMapIterator_create(admin->importedIpcSegment);
+       while (hashMapIterator_hasNext(iter)) {
+               ipc_segment_pt ipc = hashMapIterator_nextValue(iter);
+               shmdt(ipc->shmBaseAdress);
+       }
+
+       iter = hashMapIterator_create(admin->exportedIpcSegment);
+       while (hashMapIterator_hasNext(iter)) {
+               ipc_segment_pt ipc = hashMapIterator_nextValue(iter);
+
+               semctl(ipc->semId, 1 /*ignored*/, IPC_RMID);
+               shmctl(ipc->shmId, IPC_RMID, 0);
+       }
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_lock(int semId, int semNr) {
+       celix_status_t status = CELIX_SUCCESS;
+       int semOpStatus = 0;
+       struct sembuf semOperation;
+
+       semOperation.sem_num = semNr;
+       semOperation.sem_op = -1;
+       semOperation.sem_flg = 0;
+
+       do {
+               status = CELIX_SUCCESS;
+
+               if ((semOpStatus = semop(semId, &semOperation, 1)) != 0) {
+                       status = CELIX_BUNDLE_EXCEPTION;
+               }
+       } while (semOpStatus == -1 && errno == EINTR);
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_unlock(int semId, int semNr) {
+       celix_status_t status = CELIX_SUCCESS;
+       int semOpStatus = 0;
+       struct sembuf semOperation;
+
+       semOperation.sem_num = semNr;
+       semOperation.sem_op = 1;
+       semOperation.sem_flg = 0;
+
+       do {
+               status = CELIX_SUCCESS;
+
+               if ((semOpStatus = semop(semId, &semOperation, 1)) != 0) {
+                       status = CELIX_BUNDLE_EXCEPTION;
+               }
+       } while (semOpStatus == -1 && errno == EINTR);
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_wait(int semId, int semNr) {
+       celix_status_t status = CELIX_SUCCESS;
+       int semOpStatus = 0;
+       struct sembuf semOperation;
+
+       semOperation.sem_num = semNr;
+       semOperation.sem_op = 0;
+       semOperation.sem_flg = 0;
+
+       do {
+               status = CELIX_SUCCESS;
+
+               if ((semOpStatus = semop(semId, &semOperation, 1)) != 0) {
+                       status = CELIX_BUNDLE_EXCEPTION;
+               }
+       } while (semOpStatus == -1 && errno == EINTR);
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_send(remote_service_admin_pt admin,
+               endpoint_description_pt recpEndpoint, char *method, char *data,
+               char **reply, int *replyStatus) {
+
+       celix_status_t status = CELIX_SUCCESS;
+       ipc_segment_pt ipc = NULL;
+
+       if ((ipc = hashMap_get(admin->importedIpcSegment, 
recpEndpoint->service))
+                       != NULL) {
+               hash_map_pt fncCallProps = hashMap_create(utils_stringHash,
+                               utils_stringHash, utils_stringEquals, 
utils_stringEquals);
+               char *encFncCallProps = NULL;
+               int semid = ipc->semId;
+
+               /* write method and data */
+               hashMap_put(fncCallProps, RSA_FUNCTIONCALL_METHOD_PROPERTYNAME, 
method);
+               hashMap_put(fncCallProps, RSA_FUNCTIONCALL_DATA_PROPERTYNAME, 
data);
+
+               if ((status = netstring_encodeFromHashMap(admin->pool, 
fncCallProps,
+                               &encFncCallProps)) == CELIX_SUCCESS) {
+                       char *fncCallReply = NULL;
+                       char *fncCallReplyStatus = CELIX_SUCCESS;
+
+                       strcpy(ipc->shmBaseAdress, encFncCallProps);
+
+                       remoteServiceAdmin_unlock(semid, 0); //sem0: 0 -> 1
+                       remoteServiceAdmin_wait(semid, 2); //sem2: when 0 
continue
+                       remoteServiceAdmin_lock(semid, 1); //sem1: 1 -> 0
+
+                       if ((status = netstring_decodeToHashMap(admin->pool,
+                                       ipc->shmBaseAdress, fncCallProps)) == 
CELIX_SUCCESS) {
+                               fncCallReply = hashMap_get(fncCallProps,
+                                               
RSA_FUNCTIONCALL_RETURN_PROPERTYNAME);
+                               fncCallReplyStatus = hashMap_get(fncCallProps,
+                                               
RSA_FUNCTIONCALL_RETURNSTATUS_PROPERTYNAME);
+                       }
+
+                       if (fncCallReply != NULL) {
+                               *reply = strdup(fncCallReply);
+                       }
+
+                       if (fncCallReplyStatus != NULL) {
+                               *replyStatus = apr_atoi64(fncCallReplyStatus);
+                       }
+               }
+
+               hashMap_destroy(fncCallProps, false, false);
+       } else {
+               status = CELIX_ILLEGAL_STATE; /* could not find ipc segment */
+       }
 
-celix_status_t remoteServiceAdmin_createOrAttachShm(hash_map_pt ipcSegment, 
remote_service_admin_pt admin, endpoint_description_pt endpointDescription, 
bool createIfNotFound);
-celix_status_t remoteServiceAdmin_create(apr_pool_t *pool, bundle_context_pt 
context, remote_service_admin_pt *admin)
-{
-    celix_status_t status = CELIX_SUCCESS;
-
-    *admin = apr_palloc(pool, sizeof(**admin));
-    if (!*admin)
-    {
-        status = CELIX_ENOMEM;
-    }
-    else
-    {
-        (*admin)->pool = pool;
-        (*admin)->context = context;
-        (*admin)->exportedServices = hashMap_create(NULL, NULL, NULL, NULL);
-        (*admin)->importedServices = hashMap_create(NULL, NULL, NULL, NULL);
-        (*admin)->exportedIpcSegment = hashMap_create(NULL, NULL, NULL, NULL);
-        (*admin)->importedIpcSegment = hashMap_create(NULL, NULL, NULL, NULL);
-        (*admin)->pollThread = hashMap_create(NULL, NULL, NULL, NULL);
-        (*admin)->pollThreadRunning =  hashMap_create(NULL, NULL, NULL, NULL);
-    }
-
-    return status;
-}
-
-
-
-
-celix_status_t remoteServiceAdmin_stop(remote_service_admin_pt admin)
-{
-    celix_status_t status = CELIX_SUCCESS;
-
-    hash_map_iterator_pt iter = 
hashMapIterator_create(admin->importedServices);
-    while (hashMapIterator_hasNext(iter))
-    {
-        array_list_pt exports = hashMapIterator_nextValue(iter);
-        int i;
-        for (i = 0; i < arrayList_size(exports); i++)
-        {
-            import_registration_pt export = arrayList_get(exports, i);
-            importRegistration_stopTracking(export);
-        }
-    }
-
-    // set stop-thread-variable
-    iter = hashMapIterator_create(admin->pollThreadRunning);
-    while (hashMapIterator_hasNext(iter))
-    {
-        bool *pollThreadRunning = hashMapIterator_nextValue(iter);
-        *pollThreadRunning = false;
-    }
-
-    // release lock
-    iter = hashMapIterator_create(admin->exportedIpcSegment);
-    while (hashMapIterator_hasNext(iter))
-    {
-        ipc_segment_pt ipc = hashMapIterator_nextValue(iter);
-        remoteServiceAdmin_unlock(ipc->semId, 0);
-    }
-
-    // wait till threads has stopped
-    iter = hashMapIterator_create(admin->pollThread);
-    while (hashMapIterator_hasNext(iter))
-    {
-        apr_status_t tstat;
-        apr_thread_t *pollThread = hashMapIterator_nextValue(iter);
-
-        if (pollThread != NULL)
-        {
-            apr_status_t stat = apr_thread_join(&tstat, pollThread);
-
-            if (stat != APR_SUCCESS && tstat != APR_SUCCESS)
-            {
-                status = CELIX_BUNDLE_EXCEPTION;
-            }
-        }
-    }
-
-    iter = hashMapIterator_create(admin->importedIpcSegment);
-    while (hashMapIterator_hasNext(iter))
-    {
-        ipc_segment_pt ipc = hashMapIterator_nextValue(iter);
-        shmdt(ipc->shmBaseAdress);
-    }
-
-
-    iter = hashMapIterator_create(admin->exportedIpcSegment);
-    while (hashMapIterator_hasNext(iter))
-    {
-        ipc_segment_pt ipc = hashMapIterator_nextValue(iter);
-
-        semctl(ipc->semId, 1 /*ignored*/, IPC_RMID);
-        shmctl(ipc->shmId, IPC_RMID, 0);
-    }
-
-    return status;
-}
-
-
-celix_status_t remoteServiceAdmin_lock(int semId, int semNr)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    int semOpStatus = 0;
-    struct sembuf semOperation;
-
-    semOperation.sem_num = semNr;
-    semOperation.sem_op = -1;
-    semOperation.sem_flg = 0;
-
-    do
-    {
-        status = CELIX_SUCCESS;
-
-        if ((semOpStatus = semop(semId, &semOperation, 1)) != 0)
-        {
-            status = CELIX_BUNDLE_EXCEPTION;
-        }
-    }
-    while (semOpStatus == -1 && errno == EINTR);
-
-
-    return status;
-}
-
-
-celix_status_t remoteServiceAdmin_unlock(int semId, int semNr)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    int semOpStatus = 0;
-    struct sembuf semOperation;
-
-    semOperation.sem_num = semNr;
-    semOperation.sem_op = 1;
-    semOperation.sem_flg = 0;
-
-    do
-    {
-        status = CELIX_SUCCESS;
-
-        if ((semOpStatus = semop(semId, &semOperation, 1)) != 0)
-        {
-            status = CELIX_BUNDLE_EXCEPTION;
-        }
-    }
-    while (semOpStatus == -1 && errno == EINTR);
-
-    return status;
+       return status;
 }
 
-celix_status_t remoteServiceAdmin_wait(int semId, int semNr)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    int semOpStatus = 0;
-    struct sembuf semOperation;
-
-    semOperation.sem_num = semNr;
-    semOperation.sem_op = 0;
-    semOperation.sem_flg = 0;
-
-    do
-    {
-        status = CELIX_SUCCESS;
-
-        if ((semOpStatus = semop(semId, &semOperation, 1)) != 0)
-        {
-            status = CELIX_BUNDLE_EXCEPTION;
-        }
-    }
-    while (semOpStatus == -1 && errno == EINTR);
-
-    return status;
-}
-
-
-celix_status_t remoteServiceAdmin_send(remote_service_admin_pt admin, 
endpoint_description_pt recpEndpoint, char *method, char *data, char **reply, 
int *replyStatus)
-{
-
-    celix_status_t status = CELIX_SUCCESS;
-    ipc_segment_pt ipc = NULL;
-
-    if ((ipc = hashMap_get(admin->importedIpcSegment, recpEndpoint->service)) 
!= NULL)
-    {
-        hash_map_pt fncCallProps = hashMap_create(utils_stringHash, 
utils_stringHash, utils_stringEquals, utils_stringEquals);
-        char *encFncCallProps = NULL;
-        int semid = ipc->semId;
-
-        /* write method and data */
-        hashMap_put(fncCallProps, RSA_FUNCTIONCALL_METHOD_PROPERTYNAME, 
method);
-        hashMap_put(fncCallProps, RSA_FUNCTIONCALL_DATA_PROPERTYNAME, data);
-
-        if ((status = netstring_encodeFromHashMap(admin->pool, fncCallProps, 
&encFncCallProps)) == CELIX_SUCCESS)
-        {
-            char *fncCallReply = NULL;
-            char *fncCallReplyStatus = CELIX_SUCCESS;
-
-            strcpy(ipc->shmBaseAdress, encFncCallProps);
-
-            remoteServiceAdmin_unlock(semid, 0);//sem0: 0 -> 1
-            remoteServiceAdmin_wait(semid, 2);//sem2: when 0 continue
-            remoteServiceAdmin_lock(semid, 1);//sem1: 1 -> 0
-
-            if ((status = netstring_decodeToHashMap(admin->pool, 
ipc->shmBaseAdress, fncCallProps)) == CELIX_SUCCESS)
-            {
-                fncCallReply = hashMap_get(fncCallProps, 
RSA_FUNCTIONCALL_RETURN_PROPERTYNAME);
-                fncCallReplyStatus = hashMap_get(fncCallProps, 
RSA_FUNCTIONCALL_RETURNSTATUS_PROPERTYNAME);
-            }
-
-            if (fncCallReply != NULL)
-            {
-               *reply = strdup(fncCallReply);
-            }
-
-            if (fncCallReplyStatus != NULL)
-            {
-               *replyStatus = apr_atoi64(fncCallReplyStatus);
-            }
-        }
-
-        hashMap_destroy(fncCallProps, false, false);
-    }
-    else
-    {
-        status = CELIX_ILLEGAL_STATE;       /* could not find ipc segment */
-    }
-
-    return status;
-}
-
-
 static void *APR_THREAD_FUNC 
remoteServiceAdmin_receiveFromSharedMemory(apr_thread_t *thd, void *data)
 {
-    celix_status_t status = CELIX_SUCCESS;
-    recv_shm_thread_pt thread_data = data;
-
-    remote_service_admin_pt admin = thread_data->admin;
-    endpoint_description_pt exportedEndpointDesc = 
thread_data->endpointDescription;
-
-    ipc_segment_pt ipc;
-
-    if ((ipc = hashMap_get(admin->exportedIpcSegment, 
exportedEndpointDesc->service)) != NULL)
-    {
-        celix_status_t status = CELIX_SUCCESS;
-        bool *pollThreadRunning = hashMap_get(admin->pollThreadRunning, 
exportedEndpointDesc);
-
-        while (*pollThreadRunning == true)
-        {
-            // wait on semaphore 3 //sem3: when 0 continue
-            if ((remoteServiceAdmin_wait(ipc->semId, 3) != CELIX_SUCCESS))
-            {
-                printf("RSA : Error waiting on semaphore 3");
-            }
-            // acquire READ semaphore //sem0: 1 -> 0
-            else if (((status = remoteServiceAdmin_lock(ipc->semId, 0)) == 
CELIX_SUCCESS) && (*pollThreadRunning == true))
-            {
-                hash_map_pt receivedMethodCall = 
hashMap_create(utils_stringHash, utils_stringHash, utils_stringEquals, 
utils_stringEquals);
-
-                if ((status = netstring_decodeToHashMap(admin->pool, 
ipc->shmBaseAdress, receivedMethodCall)) != CELIX_SUCCESS)
-                {
-                    printf("DISCOVERY : receiveFromSharedMemory : decoding 
data to Properties\n");
-                }
-                else
-                {
-                    char *method = hashMap_get(receivedMethodCall, 
RSA_FUNCTIONCALL_METHOD_PROPERTYNAME);
-                    char *data = hashMap_get(receivedMethodCall, 
RSA_FUNCTIONCALL_DATA_PROPERTYNAME);
-
-                    if (method == NULL)
-                    {
-                        printf("RSA : receiveFromSharedMemory : no method 
found. \n");
-                    }
-                    else
-                    {
-                        hash_map_iterator_pt iter = 
hashMapIterator_create(admin->exportedServices);
-
-                        while (hashMapIterator_hasNext(iter))
-                        {
-                            hash_map_entry_pt entry = 
hashMapIterator_nextEntry(iter);
-                            array_list_pt exports = 
hashMapEntry_getValue(entry);
-                            int expIt = 0;
-
-                            for (expIt = 0; expIt < arrayList_size(exports); 
expIt++)
-                            {
-                                export_registration_pt export = 
arrayList_get(exports, expIt);
-
-                                if ( (strcmp(exportedEndpointDesc->service, 
export->endpointDescription->service) == 0) && (export->endpoint != NULL))
-                                {
-                                    char *reply = NULL;
-                                    char *encReply = NULL;
-
-                                    celix_status_t replyStatus = 
export->endpoint->handleRequest(export->endpoint->endpoint, method, data, 
&reply);
-                                    hashMap_put(receivedMethodCall, 
RSA_FUNCTIONCALL_RETURNSTATUS_PROPERTYNAME, apr_itoa(admin->pool, replyStatus));
-
-                                    if (reply != NULL)
-                                    {
-                                        hashMap_put(receivedMethodCall, 
RSA_FUNCTIONCALL_RETURN_PROPERTYNAME, reply);
-
-                                        // write back
-                                        if ((status = 
netstring_encodeFromHashMap(admin->pool, receivedMethodCall, &encReply)) == 
CELIX_SUCCESS)
-                                        {
-
-                                            if ((strlen(encReply) * 
sizeof(char)) >= RSA_SHM_MEMSIZE)
-                                            {
-                                                printf("RSA : 
receiveFromSharedMemory : size of message bigger than shared memory message. 
NOT SENDING.\n");
-                                            }
-                                            else
-                                            {
-                                                strcpy(ipc->shmBaseAdress, 
encReply);
-                                            }
-                                        }
-                                        else
-                                        {
-                                            printf("RSA : 
receiveFromSharedMemory : encoding of reply failed\n");
-                                        }
-                                    }
-                                }
-                                else
-                                {
-                                    printf("RSA : receiveFromSharedMemory : No 
endpoint set for %s\n", export->endpointDescription->service );
-                                }
-                            }
-                        }
-
-                        remoteServiceAdmin_unlock(ipc->semId, 1); //sem1: 0 -> 
1
-                    }
-                }
-                hashMap_destroy(receivedMethodCall, false, false);
-            }
-        }
-    }
-    apr_thread_exit(thd, (status == CELIX_SUCCESS) ? APR_SUCCESS : -1);
-
-    return NULL;
-}
-
-
-
-
-
-
-
-
-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(registrations);
+       celix_status_t status = CELIX_SUCCESS;
+       recv_shm_thread_pt thread_data = data;
 
-    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 *) 
OSGI_FRAMEWORK_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);
-    char *exports = properties_get(serviceProperties, (char *) 
OSGI_RSA_SERVICE_EXPORTED_INTERFACES);
-    char *provided = properties_get(serviceProperties, (char *) 
OSGI_FRAMEWORK_OBJECTCLASS);
-
-    if (exports == NULL || provided == NULL)
-    {
-        printf("RSA: No Services to export.\n");
-    }
-    else
-    {
-        printf("RSA: Export services (%s)\n", exports);
-        array_list_pt interfaces = NULL;
-        arrayList_create(&interfaces);
-        if (strcmp(utils_stringTrim(exports), "*") == 0)
-        {
-            char *token;
-            char *interface = apr_strtok(provided, ",", &token);
-            while (interface != NULL)
-            {
-                arrayList_add(interfaces, utils_stringTrim(interface));
-                interface = apr_strtok(NULL, ",", &token);
-            }
-        }
-        else
-        {
-            char *exportToken;
-            char *providedToken;
-
-            char *pinterface = apr_strtok(provided, ",", &providedToken);
-            while (pinterface != NULL)
-            {
-                char *einterface = apr_strtok(exports, ",", &exportToken);
-                while (einterface != NULL)
-                {
-                    if (strcmp(einterface, pinterface) == 0)
-                    {
-                        arrayList_add(interfaces, einterface);
-                    }
-                    einterface = apr_strtok(NULL, ",", &exportToken);
-                }
-                pinterface = apr_strtok(NULL, ",", &providedToken);
-            }
-        }
-
-        if (arrayList_size(interfaces) != 0)
-        {
-            int iter = 0;
-            for (iter = 0; iter < arrayList_size(interfaces); iter++)
-            {
-                char *interface = arrayList_get(interfaces, iter);
-                export_registration_pt registration = NULL;
-
-                exportRegistration_create(admin->pool, reference, NULL, admin, 
admin->context, &registration);
-
-                arrayList_add(*registrations, registration);
-
-                remoteServiceAdmin_installEndpoint(admin, registration, 
reference, interface);
-                exportRegistration_open(registration);
-                exportRegistration_startTracking(registration);
-
-                if ( 
remoteServiceAdmin_createOrAttachShm(admin->exportedIpcSegment, admin, 
registration->endpointDescription, true) == CELIX_SUCCESS)
-                {
-                    recv_shm_thread_pt recvThreadData = NULL;
-
-                    if ((recvThreadData = apr_palloc(admin->pool, 
sizeof(*recvThreadData))) == NULL)
-                    {
-                        status = CELIX_ENOMEM;
-                    }
-                    else
-                    {
-                        recvThreadData->admin = admin;
-                        recvThreadData->endpointDescription = 
registration->endpointDescription;
-
-                        apr_thread_t *pollThread = NULL;
-                        bool *pollThreadRunningPtr = apr_palloc(admin->pool, 
sizeof(*pollThreadRunningPtr));
-                        *pollThreadRunningPtr  = true;
-
-                        hashMap_put(admin->pollThreadRunning, 
registration->endpointDescription, pollThreadRunningPtr);
-
-                        // start receiving thread
-                        apr_thread_create(&pollThread, NULL, 
remoteServiceAdmin_receiveFromSharedMemory, recvThreadData, (admin)->pool);
-
-                        hashMap_put(admin->pollThread, 
registration->endpointDescription, pollThread);
-                    }
-                }
-            }
-
-            hashMap_put(admin->exportedServices, reference, *registrations);
-        }
-    }
+       remote_service_admin_pt admin = thread_data->admin;
+       endpoint_description_pt exportedEndpointDesc = 
thread_data->endpointDescription;
 
-    return status;
-}
-
-
-celix_status_t remoteServiceAdmin_removeExportedService(export_registration_pt 
registration)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    remote_service_admin_pt admin = registration->rsa;
-    bool *pollThreadRunning = NULL;
-    ipc_segment_pt ipc = NULL;
-    apr_thread_t *pollThread = NULL;
-
-    hashMap_remove(admin->exportedServices, registration->reference);
-
-    if ((pollThreadRunning = hashMap_get(admin->pollThreadRunning, 
registration->endpointDescription)) != NULL)
-    {
-        *pollThreadRunning = false;
-    }
-
-    if ((ipc = hashMap_get(admin->exportedIpcSegment, 
registration->endpointDescription->service)) != NULL)
-    {
-        remoteServiceAdmin_unlock(ipc->semId, 0);
-
-        if ( (pollThread = hashMap_get(admin->pollThread, 
registration->endpointDescription)) != NULL)
-        {
-            apr_status_t tstat;
-            apr_status_t stat = apr_thread_join(&tstat, pollThread);
-
-            if (stat != APR_SUCCESS && tstat != APR_SUCCESS)
-            {
-                status = CELIX_BUNDLE_EXCEPTION;
-            }
-            else
-            {
-                semctl(ipc->semId, 1 /*ignored*/, IPC_RMID);
-                shmctl(ipc->shmId, IPC_RMID, 0);
-
-                hashMap_remove(admin->pollThreadRunning, 
registration->endpointDescription);
-                hashMap_remove(admin->exportedIpcSegment, 
registration->endpointDescription->service);
-                hashMap_remove(admin->pollThread, 
registration->endpointDescription);
-            }
-        }
-    }
-
-
-    return status;
-}
-
-
-celix_status_t remoteServiceAdmin_createOrAttachShm(hash_map_pt ipcSegment, 
remote_service_admin_pt admin, endpoint_description_pt endpointDescription, 
bool createIfNotFound)
-{
-    celix_status_t status = CELIX_SUCCESS;
-
-    apr_pool_t *pool = admin->pool;
-    apr_pool_t *shmPool = NULL;
-
-    apr_status_t aprStatus = 0;
-
-    /* setup ipc sehment */
-    ipc_segment_pt ipc = NULL;
-
-    properties_pt endpointProperties = endpointDescription->properties;
-
-    char *shmPath = NULL;
-    char *shmFtokId = NULL;
-
-    char *semPath = NULL;
-    char *semFtokId = NULL;
-
-
-    if ((shmPath = properties_get(endpointProperties, (char *) 
RSA_SHM_PATH_PROPERTYNAME)) == NULL)
-    {
-        printf("RSA : No value found for key %s in endpointProperties\n", 
RSA_SHM_PATH_PROPERTYNAME);
-        status = CELIX_BUNDLE_EXCEPTION;
-    }
-    else if ((shmFtokId = properties_get(endpointProperties, (char *) 
RSA_SHM_FTOK_ID_PROPERTYNAME)) == NULL)
-    {
-        printf("RSA : No value found for key %s in endpointProperties\n", 
RSA_SHM_FTOK_ID_PROPERTYNAME);
-        status = CELIX_BUNDLE_EXCEPTION;
-    }
-    else if ((semPath = properties_get(endpointProperties, (char *) 
RSA_SEM_PATH_PROPERTYNAME)) == NULL)
-    {
-        printf("RSA : No value found for key %s in endpointProperties\n", 
RSA_SEM_PATH_PROPERTYNAME);
-        status = CELIX_BUNDLE_EXCEPTION;
-    }
-    else if ((semFtokId = properties_get(endpointProperties, (char *) 
RSA_SEM_FTOK_ID_PROPERTYNAME)) == NULL)
-    {
-        printf("RSA : No value found for key %s in endpointProperties\n", 
RSA_SEM_FTOK_ID_PROPERTYNAME);
-        status = CELIX_BUNDLE_EXCEPTION;
-    }
-    else
-    {
-        key_t shmKey = ftok(shmPath, atoi(shmFtokId));
-        ipc = apr_palloc(admin->pool, sizeof(*ipc));
-
-        if ((ipc->shmId = shmget(shmKey, RSA_SHM_MEMSIZE, 0666)) < 0)
-        {
-            printf("RSA : Could not attach to shared memory\n");
-
-            if (createIfNotFound == true)
-            {
-                if ((ipc->shmId = shmget(shmKey, RSA_SHM_MEMSIZE, IPC_CREAT | 
0666)) < 0)
-                {
-                    printf("RSA : Creation of shared memory segment failed\n");
-                    status = CELIX_BUNDLE_EXCEPTION;
-                }
-                else if ((ipc->shmBaseAdress = shmat(ipc->shmId, 0, 0)) == 
(char *) - 1 )
-                {
-                    printf("RSA : Attaching of shared memory segment 
failed\n");
-                    status = CELIX_BUNDLE_EXCEPTION;
-                }
-                else
-                {
-                    printf("RSA : shared memory segment sucessfully created at 
%p \n", ipc->shmBaseAdress);
-                }
-            }
-        }
-        else if ((ipc->shmBaseAdress = shmat(ipc->shmId, 0, 0)) == (char *) - 
1 )
-        {
-            printf("RSA : Attaching of shared memory segment failed\n");
-            status = CELIX_BUNDLE_EXCEPTION;
-        }
-        else
-        {
-            printf("RSA : sucessfully attached to shared memory at %p \n", 
ipc->shmBaseAdress);
-        }
-    }
-
-    if ((status == CELIX_SUCCESS) && (ipc != NULL))
-    {
-        key_t semkey = ftok(semPath, atoi(semFtokId));
-        int semflg = (createIfNotFound == true) ? (0666 | IPC_CREAT) : (0666);
-        int semid = semget(semkey, 4, semflg);
-
-        if (semid != -1)
-        {
-            // only reset semaphores if a create was supposed
-            if ((createIfNotFound == true) && ((semctl (semid, 0, SETVAL, 
(int) 0) == -1) || (semctl (semid, 1, SETVAL, (int) 0) == -1) || (semctl 
(semid, 2, SETVAL, (int) 0) == -1) || (semctl (semid, 3, SETVAL, (int) 0) == 
-1)))
-            {
-                printf("RSA : error while initialize semaphores \n");
-            }
-
-            printf("RSA : semaphores w/ key %s and id %i added \n", 
endpointDescription->service, semid);
-            ipc->semId = semid;
-
-            hashMap_put(ipcSegment, endpointDescription->service, ipc);
-        }
-        else
-        {
-            printf("RSA : error getting semaphores.\n");
-            status = CELIX_BUNDLE_EXCEPTION;
-        }
-    }
-
-    return status;
-}
-
-
-
-celix_status_t remoteServiceAdmin_installEndpoint(remote_service_admin_pt 
admin, export_registration_pt registration, service_reference_pt reference, 
char *interface)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    properties_pt endpointProperties = properties_create();
-    properties_pt serviceProperties = NULL;
-
-    service_registration_pt sRegistration = NULL;
-    serviceReference_getServiceRegistration(reference, &sRegistration);
-
-    serviceRegistration_getProperties(sRegistration, &serviceProperties);
-
-    hash_map_iterator_pt iter = hashMapIterator_create(serviceProperties);
-    while (hashMapIterator_hasNext(iter))
-    {
-        hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
-        char *key = (char *) hashMapEntry_getKey(entry);
-        char *value = (char *) hashMapEntry_getValue(entry);
-
-        properties_set(endpointProperties, key, value);
-    }
-    char *serviceId = (char *) hashMap_remove(endpointProperties, (void *) 
OSGI_FRAMEWORK_SERVICE_ID);
-    properties_set(endpointProperties, (char *) OSGI_FRAMEWORK_OBJECTCLASS, 
interface);
-    properties_set(endpointProperties, (char *) OSGI_RSA_ENDPOINT_SERVICE_ID, 
serviceId);
-
-    char *uuid = NULL;
-    bundleContext_getProperty(admin->context, OSGI_FRAMEWORK_FRAMEWORK_UUID, 
&uuid);
-    properties_set(endpointProperties, (char *) 
OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, uuid);
-    properties_set(endpointProperties, (char *) OSGI_RSA_SERVICE_LOCATION, 
apr_pstrdup(admin->pool, interface));
-    if (properties_get(endpointProperties, (char *) RSA_SHM_PATH_PROPERTYNAME) 
== NULL)
-    {
-        properties_set(endpointProperties, (char *) RSA_SHM_PATH_PROPERTYNAME, 
apr_pstrdup(admin->pool, (char *) RSA_SHM_DEFAULTPATH));
-    }
-    if (properties_get(endpointProperties, (char *) 
RSA_SHM_FTOK_ID_PROPERTYNAME) == NULL)
-    {
-        properties_set(endpointProperties, (char *) 
RSA_SHM_FTOK_ID_PROPERTYNAME, apr_pstrdup(admin->pool, (char *) 
RSA_SHM_DEFAULT_FTOK_ID));
-    }
-    if (properties_get(endpointProperties, (char *) RSA_SEM_PATH_PROPERTYNAME) 
== NULL)
-    {
-        properties_set(endpointProperties, (char *) RSA_SEM_PATH_PROPERTYNAME, 
apr_pstrdup(admin->pool, RSA_SEM_DEFAULTPATH));
-    }
-    if (properties_get(endpointProperties, (char *) 
RSA_SEM_FTOK_ID_PROPERTYNAME) == NULL)
-    {
-        properties_set(endpointProperties, (char *) 
RSA_SEM_FTOK_ID_PROPERTYNAME, apr_pstrdup(admin->pool, (char *) 
RSA_SEM_DEFAULT_FTOK_ID));
-    }
-
-    endpoint_description_pt endpointDescription = NULL;
-    remoteServiceAdmin_createEndpointDescription(admin, serviceProperties, 
endpointProperties, interface, &endpointDescription);
-    exportRegistration_setEndpointDescription(registration, 
endpointDescription);
-
-    return status;
-}
-
-celix_status_t 
remoteServiceAdmin_createEndpointDescription(remote_service_admin_pt admin, 
properties_pt serviceProperties,
-        properties_pt endpointProperties, char *interface, 
endpoint_description_pt *description)
-{
-    celix_status_t status = CELIX_SUCCESS;
-
-    apr_pool_t *childPool = NULL;
-    apr_pool_create(&childPool, admin->pool);
-
-    *description = apr_palloc(childPool, sizeof(*description));
-
-    if (!*description)
-    {
-        status = CELIX_ENOMEM;
-    }
-    else
-    {
-        char *uuid = NULL;
-        status = bundleContext_getProperty(admin->context, 
OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, &uuid);
-        if (status == CELIX_SUCCESS)
-        {
-            (*description)->properties = endpointProperties;
-            (*description)->frameworkUUID = uuid;
-            (*description)->serviceId = 
apr_atoi64(properties_get(serviceProperties, (char *) 
OSGI_FRAMEWORK_SERVICE_ID));
-            (*description)->id = properties_get(endpointProperties, (char *) 
OSGI_RSA_SERVICE_LOCATION);
-            (*description)->service = interface;
-        }
-    }
-
-    return status;
-}
+       ipc_segment_pt ipc;
 
-celix_status_t remoteServiceAdmin_getExportedServices(remote_service_admin_pt 
admin, array_list_pt *services)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    return status;
-}
-
-celix_status_t remoteServiceAdmin_getImportedEndpoints(remote_service_admin_pt 
admin, array_list_pt *services)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    return status;
-}
-
-celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin, 
endpoint_description_pt endpointDescription, import_registration_pt 
*registration)
-{
-    celix_status_t status = CELIX_SUCCESS;
-
-    printf("RSA: Import service %s\n", endpointDescription->service);
-
-    importRegistration_create(admin->pool, endpointDescription, admin, 
admin->context, registration);
-
-    array_list_pt importedRegs = hashMap_get(admin->importedServices, 
endpointDescription);
-    if (importedRegs == NULL)
-    {
-        arrayList_create(&importedRegs);
-        hashMap_put(admin->importedServices, endpointDescription, 
importedRegs);
-
-    }
-    arrayList_add(importedRegs, *registration);
-
-    importRegistration_open(*registration);
-    importRegistration_startTracking(*registration);
-    remoteServiceAdmin_createOrAttachShm(admin->importedIpcSegment, admin, 
endpointDescription, false);
-
-    return status;
-}
-
-
-celix_status_t exportReference_getExportedEndpoint(export_reference_pt 
reference, endpoint_description_pt *endpoint)
-{
-    celix_status_t status = CELIX_SUCCESS;
-
-    *endpoint = reference->endpoint;
-
-    return status;
-}
-
-celix_status_t exportReference_getExportedService(export_reference_pt 
reference)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    return status;
-}
-
-celix_status_t importReference_getImportedEndpoint(import_reference_pt 
reference)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    return status;
-}
-
-celix_status_t importReference_getImportedService(import_reference_pt 
reference)
-{
-    celix_status_t status = CELIX_SUCCESS;
-    return status;
+       if ((ipc = hashMap_get(admin->exportedIpcSegment, 
exportedEndpointDesc->service)) != NULL)
+       {
+               celix_status_t status = CELIX_SUCCESS;
+               bool *pollThreadRunning = hashMap_get(admin->pollThreadRunning, 
exportedEndpointDesc);
+
+               while (*pollThreadRunning == true)
+               {
+                       // wait on semaphore 3 //sem3: when 0 continue
+                       if ((remoteServiceAdmin_wait(ipc->semId, 3) != 
CELIX_SUCCESS))
+                       {
+                               printf("RSA : Error waiting on semaphore 3");
+                       }
+                       // acquire READ semaphore //sem0: 1 -> 0
+                       else if (((status = remoteServiceAdmin_lock(ipc->semId, 
0)) == CELIX_SUCCESS) && (*pollThreadRunning == true))
+                       {
+                               hash_map_pt receivedMethodCall = 
hashMap_create(utils_stringHash, utils_stringHash, utils_stringEquals, 
utils_stringEquals);
+
+                               if ((status = 
netstring_decodeToHashMap(admin->pool, ipc->shmBaseAdress, receivedMethodCall)) 
!= CELIX_SUCCESS)
+                               {
+                                       printf("DISCOVERY : 
receiveFromSharedMemory : decoding data to Properties\n");
+                               }
+                               else
+                               {
+                                       char *method = 
hashMap_get(receivedMethodCall, RSA_FUNCTIONCALL_METHOD_PROPERTYNAME);
+                                       char *data = 
hashMap_get(receivedMethodCall, RSA_FUNCTIONCALL_DATA_PROPERTYNAME);
+
+                                       if (method == NULL)
+                                       {
+                                               printf("RSA : 
receiveFromSharedMemory : no method found. \n");
+                                       }
+                                       else
+                                       {
+                                               hash_map_iterator_pt iter = 
hashMapIterator_create(admin->exportedServices);
+
+                                               while 
(hashMapIterator_hasNext(iter))
+                                               {
+                                                       hash_map_entry_pt entry 
= hashMapIterator_nextEntry(iter);
+                                                       array_list_pt exports = 
hashMapEntry_getValue(entry);
+                                                       int expIt = 0;
+
+                                                       for (expIt = 0; expIt < 
arrayList_size(exports); expIt++)
+                                                       {
+                                                               
export_registration_pt export = arrayList_get(exports, expIt);
+
+                                                               if ( 
(strcmp(exportedEndpointDesc->service, export->endpointDescription->service) == 
0) && (export->endpoint != NULL))
+                                                               {
+                                                                       char 
*reply = NULL;
+                                                                       char 
*encReply = NULL;
+
+                                                                       
celix_status_t replyStatus = 
export->endpoint->handleRequest(export->endpoint->endpoint, method, data, 
&reply);
+                                                                       
hashMap_put(receivedMethodCall, RSA_FUNCTIONCALL_RETURNSTATUS_PROPERTYNAME, 
apr_itoa(admin->pool, replyStatus));
+
+                                                                       if 
(reply != NULL)
+                                                                       {
+                                                                               
hashMap_put(receivedMethodCall, RSA_FUNCTIONCALL_RETURN_PROPERTYNAME, reply);
+
+                                                                               
// write back
+                                                                               
if ((status = netstring_encodeFromHashMap(admin->pool, receivedMethodCall, 
&encReply)) == CELIX_SUCCESS)
+                                                                               
{
+
+                                                                               
        if ((strlen(encReply) * sizeof(char)) >= RSA_SHM_MEMSIZE)
+                                                                               
        {
+                                                                               
                printf("RSA : receiveFromSharedMemory : size of message bigger 
than shared memory message. NOT SENDING.\n");
+                                                                               
        }
+                                                                               
        else
+                                                                               
        {
+                                                                               
                strcpy(ipc->shmBaseAdress, encReply);
+                                                                               
        }
+                                                                               
}
+                                                                               
else
+                                                                               
{
+                                                                               
        printf("RSA : receiveFromSharedMemory : encoding of reply failed\n");
+                                                                               
}
+                                                                       }
+                                                               }
+                                                               else
+                                                               {
+                                                                       
printf("RSA : receiveFromSharedMemory : No endpoint set for %s\n", 
export->endpointDescription->service );
+                                                               }
+                                                       }
+                                               }
+
+                                               
remoteServiceAdmin_unlock(ipc->semId, 1); //sem1: 0 -> 1
+                                       }
+                               }
+                               hashMap_destroy(receivedMethodCall, false, 
false);
+                       }
+               }
+       }
+       apr_thread_exit(thd, (status == CELIX_SUCCESS) ? APR_SUCCESS : -1);
+
+       return NULL;
+}
+
+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(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 *) OSGI_FRAMEWORK_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);
+       char *exports = properties_get(serviceProperties,
+                       (char *) OSGI_RSA_SERVICE_EXPORTED_INTERFACES);
+       char *provided = properties_get(serviceProperties,
+                       (char *) OSGI_FRAMEWORK_OBJECTCLASS);
+
+       if (exports == NULL || provided == NULL) {
+               printf("RSA: No Services to export.\n");
+       } else {
+               printf("RSA: Export services (%s)\n", exports);
+               array_list_pt interfaces = NULL;
+               arrayList_create(&interfaces);
+               if (strcmp(utils_stringTrim(exports), "*") == 0) {
+                       char *token;
+                       char *interface = apr_strtok(provided, ",", &token);
+                       while (interface != NULL) {
+                               arrayList_add(interfaces, 
utils_stringTrim(interface));
+                               interface = apr_strtok(NULL, ",", &token);
+                       }
+               } else {
+                       char *exportToken;
+                       char *providedToken;
+
+                       char *pinterface = apr_strtok(provided, ",", 
&providedToken);
+                       while (pinterface != NULL) {
+                               char *einterface = apr_strtok(exports, ",", 
&exportToken);
+                               while (einterface != NULL) {
+                                       if (strcmp(einterface, pinterface) == 
0) {
+                                               arrayList_add(interfaces, 
einterface);
+                                       }
+                                       einterface = apr_strtok(NULL, ",", 
&exportToken);
+                               }
+                               pinterface = apr_strtok(NULL, ",", 
&providedToken);
+                       }
+               }
+
+               if (arrayList_size(interfaces) != 0) {
+                       int iter = 0;
+                       for (iter = 0; iter < arrayList_size(interfaces); 
iter++) {
+                               char *interface = arrayList_get(interfaces, 
iter);
+                               export_registration_pt registration = NULL;
+
+                               exportRegistration_create(admin->pool, 
reference, NULL, admin,
+                                               admin->context, &registration);
+
+                               arrayList_add(*registrations, registration);
+
+                               remoteServiceAdmin_installEndpoint(admin, 
registration,
+                                               reference, interface);
+                               exportRegistration_open(registration);
+                               exportRegistration_startTracking(registration);
+
+                               if (remoteServiceAdmin_createOrAttachShm(
+                                               admin->exportedIpcSegment, 
admin,
+                                               
registration->endpointDescription,
+                                               true) == CELIX_SUCCESS) {
+                                       recv_shm_thread_pt recvThreadData = 
NULL;
+
+                                       if ((recvThreadData = 
apr_palloc(admin->pool,
+                                                       
sizeof(*recvThreadData))) == NULL) {
+                                               status = CELIX_ENOMEM;
+                                       } else {
+                                               recvThreadData->admin = admin;
+                                               
recvThreadData->endpointDescription =
+                                                               
registration->endpointDescription;
+
+                                               apr_thread_t *pollThread = NULL;
+                                               bool *pollThreadRunningPtr = 
apr_palloc(admin->pool,
+                                                               
sizeof(*pollThreadRunningPtr));
+                                               *pollThreadRunningPtr = true;
+
+                                               
hashMap_put(admin->pollThreadRunning,
+                                                               
registration->endpointDescription,
+                                                               
pollThreadRunningPtr);
+
+                                               // start receiving thread
+                                               apr_thread_create(&pollThread, 
NULL,
+                                                               
remoteServiceAdmin_receiveFromSharedMemory,
+                                                               recvThreadData, 
(admin)->pool);
+
+                                               hashMap_put(admin->pollThread,
+                                                               
registration->endpointDescription, pollThread);
+                                       }
+                               }
+                       }
+
+                       hashMap_put(admin->exportedServices, reference, 
*registrations);
+               }
+       }
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_removeExportedService(
+               export_registration_pt registration) {
+       celix_status_t status = CELIX_SUCCESS;
+       remote_service_admin_pt admin = registration->rsa;
+       bool *pollThreadRunning = NULL;
+       ipc_segment_pt ipc = NULL;
+       apr_thread_t *pollThread = NULL;
+
+       hashMap_remove(admin->exportedServices, registration->reference);
+
+       if ((pollThreadRunning = hashMap_get(admin->pollThreadRunning,
+                       registration->endpointDescription)) != NULL) {
+               *pollThreadRunning = false;
+       }
+
+       if ((ipc = hashMap_get(admin->exportedIpcSegment,
+                       registration->endpointDescription->service)) != NULL) {
+               remoteServiceAdmin_unlock(ipc->semId, 0);
+
+               if ((pollThread = hashMap_get(admin->pollThread,
+                               registration->endpointDescription)) != NULL) {
+                       apr_status_t tstat;
+                       apr_status_t stat = apr_thread_join(&tstat, pollThread);
+
+                       if (stat != APR_SUCCESS && tstat != APR_SUCCESS) {
+                               status = CELIX_BUNDLE_EXCEPTION;
+                       } else {
+                               semctl(ipc->semId, 1 /*ignored*/, IPC_RMID);
+                               shmctl(ipc->shmId, IPC_RMID, 0);
+
+                               hashMap_remove(admin->pollThreadRunning,
+                                               
registration->endpointDescription);
+                               hashMap_remove(admin->exportedIpcSegment,
+                                               
registration->endpointDescription->service);
+                               hashMap_remove(admin->pollThread,
+                                               
registration->endpointDescription);
+                       }
+               }
+       }
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_createOrAttachShm(hash_map_pt ipcSegment,
+               remote_service_admin_pt admin,
+               endpoint_description_pt endpointDescription, bool 
createIfNotFound) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       apr_pool_t *pool = admin->pool;
+       apr_pool_t *shmPool = NULL;
+
+       apr_status_t aprStatus = 0;
+
+       /* setup ipc sehment */
+       ipc_segment_pt ipc = NULL;
+
+       properties_pt endpointProperties = endpointDescription->properties;
+
+       char *shmPath = NULL;
+       char *shmFtokId = NULL;
+
+       char *semPath = NULL;
+       char *semFtokId = NULL;
+
+       if ((shmPath = properties_get(endpointProperties,
+                       (char *) RSA_SHM_PATH_PROPERTYNAME)) == NULL) {
+               printf("RSA : No value found for key %s in 
endpointProperties\n",
+                               RSA_SHM_PATH_PROPERTYNAME);
+               status = CELIX_BUNDLE_EXCEPTION;
+       } else if ((shmFtokId = properties_get(endpointProperties,
+                       (char *) RSA_SHM_FTOK_ID_PROPERTYNAME)) == NULL) {
+               printf("RSA : No value found for key %s in 
endpointProperties\n",
+                               RSA_SHM_FTOK_ID_PROPERTYNAME);
+               status = CELIX_BUNDLE_EXCEPTION;
+       } else if ((semPath = properties_get(endpointProperties,
+                       (char *) RSA_SEM_PATH_PROPERTYNAME)) == NULL) {
+               printf("RSA : No value found for key %s in 
endpointProperties\n",
+                               RSA_SEM_PATH_PROPERTYNAME);
+               status = CELIX_BUNDLE_EXCEPTION;
+       } else if ((semFtokId = properties_get(endpointProperties,
+                       (char *) RSA_SEM_FTOK_ID_PROPERTYNAME)) == NULL) {
+               printf("RSA : No value found for key %s in 
endpointProperties\n",
+                               RSA_SEM_FTOK_ID_PROPERTYNAME);
+               status = CELIX_BUNDLE_EXCEPTION;
+       } else {
+               key_t shmKey = ftok(shmPath, atoi(shmFtokId));
+               ipc = apr_palloc(admin->pool, sizeof(*ipc));
+
+               if ((ipc->shmId = shmget(shmKey, RSA_SHM_MEMSIZE, 0666)) < 0) {
+                       printf("RSA : Could not attach to shared memory\n");
+
+                       if (createIfNotFound == true) {
+                               if ((ipc->shmId = shmget(shmKey, 
RSA_SHM_MEMSIZE,
+                                               IPC_CREAT | 0666)) < 0) {
+                                       printf("RSA : Creation of shared memory 
segment failed\n");
+                                       status = CELIX_BUNDLE_EXCEPTION;
+                               } else if ((ipc->shmBaseAdress = 
shmat(ipc->shmId, 0, 0))
+                                               == (char *) -1) {
+                                       printf("RSA : Attaching of shared 
memory segment failed\n");
+                                       status = CELIX_BUNDLE_EXCEPTION;
+                               } else {
+                                       printf(
+                                                       "RSA : shared memory 
segment sucessfully created at %p \n",
+                                                       ipc->shmBaseAdress);
+                               }
+                       }
+               } else if ((ipc->shmBaseAdress = shmat(ipc->shmId, 0, 0))
+                               == (char *) -1) {
+                       printf("RSA : Attaching of shared memory segment 
failed\n");
+                       status = CELIX_BUNDLE_EXCEPTION;
+               } else {
+                       printf("RSA : sucessfully attached to shared memory at 
%p \n",
+                                       ipc->shmBaseAdress);
+               }
+       }
+
+       if ((status == CELIX_SUCCESS) && (ipc != NULL)) {
+               key_t semkey = ftok(semPath, atoi(semFtokId));
+               int semflg = (createIfNotFound == true) ? (0666 | IPC_CREAT) : 
(0666);
+               int semid = semget(semkey, 4, semflg);
+
+               if (semid != -1) {
+                       // only reset semaphores if a create was supposed
+                       if ((createIfNotFound == true)
+                                       && ((semctl(semid, 0, SETVAL, (int) 0) 
== -1)
+                                                       || (semctl(semid, 1, 
SETVAL, (int) 0) == -1)
+                                                       || (semctl(semid, 2, 
SETVAL, (int) 0) == -1)
+                                                       || (semctl(semid, 3, 
SETVAL, (int) 0) == -1))) {
+                               printf("RSA : error while initialize semaphores 
\n");
+                       }
+
+                       printf("RSA : semaphores w/ key %s and id %i added \n",
+                                       endpointDescription->service, semid);
+                       ipc->semId = semid;
+
+                       hashMap_put(ipcSegment, endpointDescription->service, 
ipc);
+               } else {
+                       printf("RSA : error getting semaphores.\n");
+                       status = CELIX_BUNDLE_EXCEPTION;
+               }
+       }
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_installEndpoint(remote_service_admin_pt 
admin,
+               export_registration_pt registration, service_reference_pt 
reference,
+               char *interface) {
+       celix_status_t status = CELIX_SUCCESS;
+       properties_pt endpointProperties = properties_create();
+       properties_pt serviceProperties = NULL;
+
+       service_registration_pt sRegistration = NULL;
+       serviceReference_getServiceRegistration(reference, &sRegistration);
+
+       serviceRegistration_getProperties(sRegistration, &serviceProperties);
+
+       hash_map_iterator_pt iter = hashMapIterator_create(serviceProperties);
+       while (hashMapIterator_hasNext(iter)) {
+               hash_map_entry_pt entry = hashMapIterator_nextEntry(iter);
+               char *key = (char *) hashMapEntry_getKey(entry);
+               char *value = (char *) hashMapEntry_getValue(entry);
+
+               properties_set(endpointProperties, key, value);
+       }
+       char *serviceId = (char *) hashMap_remove(endpointProperties,
+                       (void *) OSGI_FRAMEWORK_SERVICE_ID);
+       properties_set(endpointProperties, (char *) OSGI_FRAMEWORK_OBJECTCLASS,
+                       interface);
+       properties_set(endpointProperties, (char *) 
OSGI_RSA_ENDPOINT_SERVICE_ID,
+                       serviceId);
+
+       char *uuid = NULL;
+       bundleContext_getProperty(admin->context, OSGI_FRAMEWORK_FRAMEWORK_UUID,
+                       &uuid);
+       properties_set(endpointProperties,
+                       (char *) OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, uuid);
+       properties_set(endpointProperties, (char *) OSGI_RSA_SERVICE_LOCATION,
+                       apr_pstrdup(admin->pool, interface));
+       if (properties_get(endpointProperties,
+                       (char *) RSA_SHM_PATH_PROPERTYNAME) == NULL) {
+               properties_set(endpointProperties, (char *) 
RSA_SHM_PATH_PROPERTYNAME,
+                               apr_pstrdup(admin->pool, (char *) 
RSA_SHM_DEFAULTPATH));
+       }
+       if (properties_get(endpointProperties,
+                       (char *) RSA_SHM_FTOK_ID_PROPERTYNAME) == NULL) {
+               properties_set(endpointProperties,
+                               (char *) RSA_SHM_FTOK_ID_PROPERTYNAME,
+                               apr_pstrdup(admin->pool, (char *) 
RSA_SHM_DEFAULT_FTOK_ID));
+       }
+       if (properties_get(endpointProperties,
+                       (char *) RSA_SEM_PATH_PROPERTYNAME) == NULL) {
+               properties_set(endpointProperties, (char *) 
RSA_SEM_PATH_PROPERTYNAME,
+                               apr_pstrdup(admin->pool, RSA_SEM_DEFAULTPATH));
+       }
+       if (properties_get(endpointProperties,
+                       (char *) RSA_SEM_FTOK_ID_PROPERTYNAME) == NULL) {
+               properties_set(endpointProperties,
+                               (char *) RSA_SEM_FTOK_ID_PROPERTYNAME,
+                               apr_pstrdup(admin->pool, (char *) 
RSA_SEM_DEFAULT_FTOK_ID));
+       }
+
+       endpoint_description_pt endpointDescription = NULL;
+       remoteServiceAdmin_createEndpointDescription(admin, serviceProperties,
+                       endpointProperties, interface, &endpointDescription);
+       exportRegistration_setEndpointDescription(registration,
+                       endpointDescription);
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_createEndpointDescription(
+               remote_service_admin_pt admin, properties_pt serviceProperties,
+               properties_pt endpointProperties, char *interface,
+               endpoint_description_pt *description) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       apr_pool_t *childPool = NULL;
+       apr_pool_create(&childPool, admin->pool);
+
+       *description = apr_palloc(childPool, sizeof(*description));
+
+       if (!*description) {
+               status = CELIX_ENOMEM;
+       } else {
+               char *uuid = NULL;
+               status = bundleContext_getProperty(admin->context,
+                               OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, &uuid);
+               if (status == CELIX_SUCCESS) {
+                       (*description)->properties = endpointProperties;
+                       (*description)->frameworkUUID = uuid;
+                       (*description)->serviceId = apr_atoi64(
+                                       properties_get(serviceProperties,
+                                                       (char *) 
OSGI_FRAMEWORK_SERVICE_ID));
+                       (*description)->id = properties_get(endpointProperties,
+                                       (char *) OSGI_RSA_SERVICE_LOCATION);
+                       (*description)->service = interface;
+               }
+       }
+
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_getExportedServices(
+               remote_service_admin_pt admin, array_list_pt *services) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_getImportedEndpoints(
+               remote_service_admin_pt admin, array_list_pt *services) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+celix_status_t remoteServiceAdmin_importService(remote_service_admin_pt admin,
+               endpoint_description_pt endpointDescription,
+               import_registration_pt *registration) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       printf("RSA: Import service %s\n", endpointDescription->service);
+
+       importRegistration_create(admin->pool, endpointDescription, admin,
+                       admin->context, registration);
+
+       array_list_pt importedRegs = hashMap_get(admin->importedServices,
+                       endpointDescription);
+       if (importedRegs == NULL) {
+               arrayList_create(&importedRegs);
+               hashMap_put(admin->importedServices, endpointDescription, 
importedRegs);
+
+       }
+       arrayList_add(importedRegs, *registration);
+
+       importRegistration_open(*registration);
+       importRegistration_startTracking(*registration);
+       remoteServiceAdmin_createOrAttachShm(admin->importedIpcSegment, admin,
+                       endpointDescription, false);
+
+       return status;
+}
+
+celix_status_t exportReference_getExportedEndpoint(
+               export_reference_pt reference, endpoint_description_pt 
*endpoint) {
+       celix_status_t status = CELIX_SUCCESS;
+
+       *endpoint = reference->endpoint;
+
+       return status;
+}
+
+celix_status_t exportReference_getExportedService(export_reference_pt 
reference) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+celix_status_t importReference_getImportedEndpoint(
+               import_reference_pt reference) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
+}
+
+celix_status_t importReference_getImportedService(import_reference_pt 
reference) {
+       celix_status_t status = CELIX_SUCCESS;
+       return status;
 }
 


Reply via email to