This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch feature/use_async_api_for_rsa
in repository https://gitbox.apache.org/repos/asf/celix.git

commit 225d413fa0ce2f97ecd8ca68ed31538192c223cb
Author: Pepijn Noltes <[email protected]>
AuthorDate: Mon May 17 16:53:31 2021 +0200

    Refactor C rsa to use celix_ api. This breaks the top man test.
---
 .../gtest/src/rsa_tests.cc                         |  70 ++++++-----
 .../src/import_registration_dfi.c                  | 128 ++++++++-------------
 .../src/import_registration_dfi.h                  |   3 -
 .../src/remote_service_admin_activator.c           | 110 ++++++------------
 .../topology_manager/tms_tst/tms_tests.cpp         |   7 --
 5 files changed, 115 insertions(+), 203 deletions(-)

diff --git 
a/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_tests.cc 
b/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_tests.cc
index b2fee66..037a4e6 100644
--- a/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_tests.cc
+++ b/bundles/remote_services/remote_service_admin_dfi/gtest/src/rsa_tests.cc
@@ -107,43 +107,30 @@ extern "C" {
     }
 
     static void testImportServiceCallback(void *handle 
__attribute__((unused)), void *svc) {
-        auto *rsa = static_cast<remote_service_admin_service_t *>(svc);
-
-        int rc = 0;
-        import_registration_t *reg = NULL;
-        endpoint_description_t *endpoint = NULL;
-
-        celix_properties_t *props = celix_properties_create();
-        celix_properties_set(props, OSGI_RSA_ENDPOINT_SERVICE_ID, "42");
-        celix_properties_set(props, OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, 
"eec5404d-51d0-47ef-8d86-c825a8beda42");
-        celix_properties_set(props, OSGI_RSA_ENDPOINT_ID, 
"eec5404d-51d0-47ef-8d86-c825a8beda42-42");
-        celix_properties_set(props, OSGI_RSA_SERVICE_IMPORTED_CONFIGS, 
TST_CONFIGURATION_TYPE);
-        celix_properties_set(props, OSGI_FRAMEWORK_OBJECTCLASS, 
"org.apache.celix.Example");
-
-        rc = endpointDescription_create(props, &endpoint);
-        ASSERT_EQ(CELIX_SUCCESS, rc);
-
-        rc = rsa->importService(rsa->admin, endpoint, &reg);
-        ASSERT_EQ(CELIX_SUCCESS, rc);
-        ASSERT_TRUE(reg != NULL);
-
-        service_reference_pt ref = NULL;
-        rc = bundleContext_getServiceReference(context, (char 
*)"org.apache.celix.Example", &ref);
-        ASSERT_EQ(CELIX_SUCCESS, rc);
-        ASSERT_TRUE(ref != NULL);
-
-        rc = bundleContext_ungetServiceReference(context, ref);
-        ASSERT_EQ(CELIX_SUCCESS, rc);
-
-        rc = endpointDescription_destroy(endpoint);
-        ASSERT_EQ(CELIX_SUCCESS, rc);
-
-        /* Cannot test. uses requesting bundles descriptor
-        void *service = NULL;
-        rc = bundleContext_getService(context, ref, &service);
-        ASSERT_EQ(CELIX_SUCCESS, rc);
-        ASSERT_TRUE(service != NULL);
-         */
+        thread_local bool init = true;
+        thread_local endpoint_description_t *endpoint = nullptr;
+        if (init) {
+            auto *rsa = static_cast<remote_service_admin_service_t *>(svc);
+            celix_properties_t *props = celix_properties_create();
+            celix_properties_set(props, OSGI_RSA_ENDPOINT_SERVICE_ID, "42");
+            celix_properties_set(props, OSGI_RSA_ENDPOINT_FRAMEWORK_UUID, 
"eec5404d-51d0-47ef-8d86-c825a8beda42");
+            celix_properties_set(props, OSGI_RSA_ENDPOINT_ID, 
"eec5404d-51d0-47ef-8d86-c825a8beda42-42");
+            celix_properties_set(props, OSGI_RSA_SERVICE_IMPORTED_CONFIGS, 
TST_CONFIGURATION_TYPE);
+            celix_properties_set(props, OSGI_FRAMEWORK_OBJECTCLASS, 
"org.apache.celix.Example");
+
+            int rc = endpointDescription_create(props, &endpoint);
+            ASSERT_EQ(CELIX_SUCCESS, rc);
+
+            import_registration_t* reg = nullptr;
+            rc = rsa->importService(rsa->admin, endpoint, &reg);
+            ASSERT_EQ(CELIX_SUCCESS, rc);
+            ASSERT_TRUE(reg != nullptr);
+
+            init = false;
+        } else {
+            int rc = endpointDescription_destroy(endpoint);
+            ASSERT_EQ(CELIX_SUCCESS, rc);
+        }
     }
 
     static void testImportService(void) {
@@ -152,8 +139,17 @@ extern "C" {
         opts.use = testImportServiceCallback;
         opts.filter.ignoreServiceLanguage = true;
         opts.waitTimeoutInSeconds = 0.25;
+
+        //first call -> init
         bool called = celix_bundleContext_useServiceWithOptions(context, 
&opts);
         ASSERT_TRUE(called);
+
+        long svcId = celix_bundleContext_findService(context, 
"org.apache.celix.Example");
+        EXPECT_GE(svcId, 0);
+
+        //second call -> deinit
+        called = celix_bundleContext_useServiceWithOptions(context, &opts);
+        ASSERT_TRUE(called);
     }
 
     static void testBundles(void) {
diff --git 
a/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.c
 
b/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.c
index 55f0e05..2c4e8dc 100644
--- 
a/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.c
+++ 
b/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.c
@@ -38,8 +38,8 @@ struct import_registration {
     send_func_type send;
     void *sendHandle;
 
-    service_factory_pt factory;
-    service_registration_t *factoryReg;
+    celix_service_factory_t factory;
+    long factorySvcId;
 
     hash_map_pt proxies; //key -> bundle, value -> service_proxy
     celix_thread_mutex_t proxiesMutex; //protects proxies
@@ -64,34 +64,28 @@ static void importRegistration_destroyProxy(struct 
service_proxy *proxy);
 static void importRegistration_clearProxies(import_registration_t *import);
 static const char* importRegistration_getUrl(import_registration_t *reg);
 static const char* importRegistration_getServiceName(import_registration_t 
*reg);
+static void* importRegistration_getService(void *handle, const celix_bundle_t 
*requestingBundle, const celix_properties_t *svcProperties);
+void importRegistration_ungetService(void *handle, const celix_bundle_t 
*requestingBundle, const celix_properties_t *svcProperties);
 
 celix_status_t importRegistration_create(celix_bundle_context_t *context, 
endpoint_description_t *endpoint, const char *classObject, const char* 
serviceVersion, FILE *logFile, import_registration_t **out) {
     celix_status_t status = CELIX_SUCCESS;
     import_registration_t *reg = calloc(1, sizeof(*reg));
+    reg->context = context;
+    reg->endpoint = endpoint;
+    reg->classObject = classObject;
+    reg->proxies = hashMap_create(NULL, NULL, NULL, NULL);
 
-    if (reg != NULL) {
-        reg->factory = calloc(1, sizeof(*reg->factory));
-    }
-
-    if (reg != NULL && reg->factory != NULL) {
-        reg->context = context;
-        reg->endpoint = endpoint;
-        reg->classObject = classObject;
-        reg->proxies = hashMap_create(NULL, NULL, NULL, NULL);
+    remoteInterceptorsHandler_create(context, &reg->interceptorsHandler);
 
-        remoteInterceptorsHandler_create(context, &reg->interceptorsHandler);
+    celixThreadMutex_create(&reg->mutex, NULL);
+    celixThreadMutex_create(&reg->proxiesMutex, NULL);
+    status = 
version_createVersionFromString((char*)serviceVersion,&(reg->version));
 
-        celixThreadMutex_create(&reg->mutex, NULL);
-        celixThreadMutex_create(&reg->proxiesMutex, NULL);
-        status = 
version_createVersionFromString((char*)serviceVersion,&(reg->version));
-
-        reg->factory->handle = reg;
-        reg->factory->getService = (void *)importRegistration_getService;
-        reg->factory->ungetService = (void *)importRegistration_ungetService;
-        reg->logFile = logFile;
-    } else {
-        status = CELIX_ENOMEM;
-    }
+    reg->factorySvcId = -1;
+    reg->factory.handle = reg;
+    reg->factory.getService = importRegistration_getService;
+    reg->factory.ungetService = importRegistration_ungetService;
+    reg->logFile = logFile;
 
 
     if (status == CELIX_SUCCESS) {
@@ -144,10 +138,6 @@ void importRegistration_destroy(import_registration_t 
*import) {
         pthread_mutex_destroy(&import->mutex);
         pthread_mutex_destroy(&import->proxiesMutex);
 
-        if (import->factory != NULL) {
-            free(import->factory);
-        }
-
         if(import->version!=NULL){
                version_destroy(import->version);
         }
@@ -156,32 +146,24 @@ void importRegistration_destroy(import_registration_t 
*import) {
 }
 
 celix_status_t importRegistration_start(import_registration_t *import) {
-    celix_status_t  status = CELIX_SUCCESS;
-    if (import->factoryReg == NULL && import->factory != NULL) {
-        celix_properties_t *props =  
celix_properties_copy(import->endpoint->properties);
-        status = bundleContext_registerServiceFactory(import->context, (char 
*)import->classObject, import->factory, props, &import->factoryReg);
-    } else {
-        status = CELIX_ILLEGAL_STATE;
-    }
-    return status;
+    celix_properties_t *props =  
celix_properties_copy(import->endpoint->properties);
+    import->factorySvcId = 
celix_bundleContext_registerServiceFactoryAsync(import->context, 
&import->factory, import->classObject, props);
+    return import->factorySvcId >= 0 ? CELIX_SUCCESS : CELIX_ILLEGAL_STATE;
 }
 
 celix_status_t importRegistration_stop(import_registration_t *import) {
-    celix_status_t status = CELIX_SUCCESS;
-
-    if (import->factoryReg != NULL) {
-        serviceRegistration_unregister(import->factoryReg);
-        import->factoryReg = NULL;
+    if (import != NULL) {
+        celix_bundleContext_unregisterService(import->context, 
import->factorySvcId);
+        import->factorySvcId = -1;
+        importRegistration_clearProxies(import);
     }
-
-    importRegistration_clearProxies(import);
-
-    return status;
+    return CELIX_SUCCESS;
 }
 
-
-celix_status_t importRegistration_getService(import_registration_t *import, 
celix_bundle_t *bundle, service_registration_t *registration, void **out) {
+static void* importRegistration_getService(void *handle, const celix_bundle_t 
*requestingBundle, const celix_properties_t *svcProperties) {
     celix_status_t  status = CELIX_SUCCESS;
+    void* svc = NULL;
+    import_registration_t* import = handle;
 
     /*
     module_pt module = NULL;
@@ -193,21 +175,36 @@ celix_status_t 
importRegistration_getService(import_registration_t *import, celi
 
 
     pthread_mutex_lock(&import->proxiesMutex);
-    struct service_proxy *proxy = hashMap_get(import->proxies, bundle);
+    struct service_proxy *proxy = hashMap_get(import->proxies, 
requestingBundle);
     if (proxy == NULL) {
-        status = importRegistration_createProxy(import, bundle, &proxy);
+        status = importRegistration_createProxy(import, 
(celix_bundle_t*)requestingBundle, &proxy);
         if (status == CELIX_SUCCESS) {
-            hashMap_put(import->proxies, bundle, proxy);
+            hashMap_put(import->proxies, (void*)requestingBundle, proxy);
         }
     }
-
     if (status == CELIX_SUCCESS) {
         proxy->count += 1;
-        *out = proxy->service;
+        svc = proxy->service;
     }
     pthread_mutex_unlock(&import->proxiesMutex);
 
-    return status;
+    return svc;
+}
+
+void importRegistration_ungetService(void *handle, const celix_bundle_t 
*requestingBundle, const celix_properties_t *svcProperties) {
+    import_registration_t* import = handle;
+    assert(import != NULL);
+    assert(import->proxies != NULL);
+    pthread_mutex_lock(&import->proxiesMutex);
+    struct service_proxy *proxy = hashMap_get(import->proxies, 
requestingBundle);
+    if (proxy != NULL) {
+        proxy->count -= 1;
+        if (proxy->count == 0) {
+            hashMap_remove(import->proxies, requestingBundle);
+            importRegistration_destroyProxy(proxy);
+        }
+    }
+    pthread_mutex_unlock(&import->proxiesMutex);
 }
 
 static celix_status_t 
importRegistration_findAndParseInterfaceDescriptor(celix_bundle_context_t * 
const context, celix_bundle_t * const bundle, char const * const name, 
dyn_interface_type **out) {
@@ -376,33 +373,6 @@ static void importRegistration_proxyFunc(void *userData, 
void *args[], void *ret
     }
 }
 
-celix_status_t importRegistration_ungetService(import_registration_t *import, 
celix_bundle_t *bundle, service_registration_t *registration, void **out) {
-    celix_status_t  status = CELIX_SUCCESS;
-
-    assert(import != NULL);
-    assert(import->proxies != NULL);
-
-    pthread_mutex_lock(&import->proxiesMutex);
-
-    struct service_proxy *proxy = hashMap_get(import->proxies, bundle);
-    if (proxy != NULL) {
-        if (*out == proxy->service) {
-            proxy->count -= 1;
-        } else {
-            status = CELIX_ILLEGAL_ARGUMENT;
-        }
-
-        if (proxy->count == 0) {
-            hashMap_remove(import->proxies, bundle);
-            importRegistration_destroyProxy(proxy);
-        }
-    }
-
-    pthread_mutex_unlock(&import->proxiesMutex);
-
-    return status;
-}
-
 static void importRegistration_destroyProxy(struct service_proxy *proxy) {
     if (proxy != NULL) {
         if (proxy->intf != NULL) {
diff --git 
a/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.h
 
b/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.h
index c99fcee..7f4c3a1 100644
--- 
a/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.h
+++ 
b/bundles/remote_services/remote_service_admin_dfi/src/import_registration_dfi.h
@@ -38,7 +38,4 @@ celix_status_t 
importRegistration_setSendFn(import_registration_t *reg,
 celix_status_t importRegistration_start(import_registration_t *import);
 celix_status_t importRegistration_stop(import_registration_t *import);
 
-celix_status_t importRegistration_getService(import_registration_t *import, 
celix_bundle_t *bundle, service_registration_t *registration, void **service);
-celix_status_t importRegistration_ungetService(import_registration_t *import, 
celix_bundle_t *bundle, service_registration_t *registration, void **service);
-
 #endif //CELIX_IMPORT_REGISTRATION_DFI_H
diff --git 
a/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_activator.c
 
b/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_activator.c
index 9ad6f0f..b524b45 100644
--- 
a/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_activator.c
+++ 
b/bundles/remote_services/remote_service_admin_dfi/src/remote_service_admin_activator.c
@@ -17,102 +17,58 @@
  * under the License.
  */
 
-#include <stdlib.h>
-#include <remote_service_admin.h>
+#include "celix_api.h"
 
 #include "remote_service_admin_dfi.h"
-
-#include "bundle_activator.h"
-#include "service_registration.h"
-
 #include "export_registration_dfi.h"
 #include "import_registration_dfi.h"
 
-struct activator {
-       remote_service_admin_t *admin;
-       remote_service_admin_service_t *adminService;
-       service_registration_t *registration;
-};
-
-celix_status_t bundleActivator_create(celix_bundle_context_t *context, void 
**userData) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator *activator;
-
-       activator = calloc(1, sizeof(*activator));
-       if (!activator) {
-               status = CELIX_ENOMEM;
-       } else {
-               activator->admin = NULL;
-               activator->registration = NULL;
-
-               *userData = activator;
-       }
+typedef struct celix_remote_service_admin_activator {
+    remote_service_admin_t *admin;
+    remote_service_admin_service_t adminService;
+    long svcIdRsa;
+} celix_remote_service_admin_activator_t;
 
-       return status;
-}
-
-celix_status_t bundleActivator_start(void * userData, celix_bundle_context_t 
*context) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator *activator = userData;
-       remote_service_admin_service_t *remoteServiceAdmin = NULL;
+static celix_status_t celix_rsa_start(celix_remote_service_admin_activator_t* 
activator, celix_bundle_context_t* ctx) {
+    celix_status_t status = CELIX_SUCCESS;
+    activator->svcIdRsa = -1;
 
-       status = remoteServiceAdmin_create(context, &activator->admin);
-       if (status == CELIX_SUCCESS) {
-               remoteServiceAdmin = calloc(1, sizeof(*remoteServiceAdmin));
-               if (!remoteServiceAdmin) {
-                       status = CELIX_ENOMEM;
-               } else {
-                       remoteServiceAdmin->admin = activator->admin;
-                       remoteServiceAdmin->exportService = 
remoteServiceAdmin_exportService;
+    status = remoteServiceAdmin_create(ctx, &activator->admin);
+    if (status == CELIX_SUCCESS) {
+        activator->adminService.admin = activator->admin;
+        activator->adminService.exportService = 
remoteServiceAdmin_exportService;
 
-                       remoteServiceAdmin->getExportedServices = 
remoteServiceAdmin_getExportedServices;
-                       remoteServiceAdmin->getImportedEndpoints = 
remoteServiceAdmin_getImportedEndpoints;
-                       remoteServiceAdmin->importService = 
remoteServiceAdmin_importService;
+        activator->adminService.getExportedServices = 
remoteServiceAdmin_getExportedServices;
+        activator->adminService.getImportedEndpoints = 
remoteServiceAdmin_getImportedEndpoints;
+        activator->adminService.importService = 
remoteServiceAdmin_importService;
 
-                       remoteServiceAdmin->exportReference_getExportedEndpoint 
= exportReference_getExportedEndpoint;
-                       remoteServiceAdmin->exportReference_getExportedService 
= exportReference_getExportedService;
+        activator->adminService.exportReference_getExportedEndpoint = 
exportReference_getExportedEndpoint;
+        activator->adminService.exportReference_getExportedService = 
exportReference_getExportedService;
 
-                       remoteServiceAdmin->exportRegistration_close = 
remoteServiceAdmin_removeExportedService;
-                       remoteServiceAdmin->exportRegistration_getException = 
exportRegistration_getException;
-                       
remoteServiceAdmin->exportRegistration_getExportReference = 
exportRegistration_getExportReference;
+        activator->adminService.exportRegistration_close = 
remoteServiceAdmin_removeExportedService;
+        activator->adminService.exportRegistration_getException = 
exportRegistration_getException;
+        activator->adminService.exportRegistration_getExportReference = 
exportRegistration_getExportReference;
 
-                       remoteServiceAdmin->importReference_getImportedEndpoint 
= importReference_getImportedEndpoint;
-                       remoteServiceAdmin->importReference_getImportedService 
= importReference_getImportedService;
+        activator->adminService.importReference_getImportedEndpoint = 
importReference_getImportedEndpoint;
+        activator->adminService.importReference_getImportedService = 
importReference_getImportedService;
 
-                       remoteServiceAdmin->importRegistration_close = 
remoteServiceAdmin_removeImportedService;
-                       remoteServiceAdmin->importRegistration_getException = 
importRegistration_getException;
-                       
remoteServiceAdmin->importRegistration_getImportReference = 
importRegistration_getImportReference;
+        activator->adminService.importRegistration_close = 
remoteServiceAdmin_removeImportedService;
+        activator->adminService.importRegistration_getException = 
importRegistration_getException;
+        activator->adminService.importRegistration_getImportReference = 
importRegistration_getImportReference;
 
-                       status = bundleContext_registerService(context, 
OSGI_RSA_REMOTE_SERVICE_ADMIN, remoteServiceAdmin, NULL, 
&activator->registration);
-                       activator->adminService = remoteServiceAdmin;
-               }
-       }
+        activator->svcIdRsa = celix_bundleContext_registerService(ctx, 
&activator->adminService, OSGI_RSA_REMOTE_SERVICE_ADMIN, NULL);
+    }
 
-       return status;
+    return status;
 }
 
-celix_status_t bundleActivator_stop(void * userData, celix_bundle_context_t 
*context) {
-    celix_status_t status = CELIX_SUCCESS;
-    struct activator *activator = userData;
-
-    serviceRegistration_unregister(activator->registration);
-    activator->registration = NULL;
-
+static celix_status_t celix_rsa_stop(celix_remote_service_admin_activator_t* 
activator, celix_bundle_context_t* ctx) {
+    celix_bundleContext_unregisterService(ctx, activator->svcIdRsa);
     remoteServiceAdmin_stop(activator->admin);
     remoteServiceAdmin_destroy(&activator->admin);
-
-    free(activator->adminService);
-
-    return status;
+    return CELIX_SUCCESS;
 }
 
-celix_status_t bundleActivator_destroy(void * userData, celix_bundle_context_t 
*context) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator *activator = userData;
-
-       free(activator);
-
-       return status;
-}
+CELIX_GEN_BUNDLE_ACTIVATOR(celix_remote_service_admin_activator_t, 
celix_rsa_start, celix_rsa_stop)
 
 
diff --git a/bundles/remote_services/topology_manager/tms_tst/tms_tests.cpp 
b/bundles/remote_services/topology_manager/tms_tst/tms_tests.cpp
index e21c3cc..5de0a74 100644
--- a/bundles/remote_services/topology_manager/tms_tst/tms_tests.cpp
+++ b/bundles/remote_services/topology_manager/tms_tst/tms_tests.cpp
@@ -16,13 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/**
- * topology_manager_scoped_test.cpp
- *
- *  \date       Feb 11, 2013
- *  \author     <a href="mailto:[email protected]";>Apache Celix Project 
Team</a>
- *  \copyright  Apache License, Version 2.0
- */
 
 #include <stdlib.h>
 #include <stdio.h>

Reply via email to