You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2021/05/18 11:11:09 UTC

[celix] branch feature/use_async_api_for_rsa updated: Change start service tracker to async for rsa import/export registration.

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


The following commit(s) were added to refs/heads/feature/use_async_api_for_rsa by this push:
     new 86225eb  Change start service tracker to async for rsa import/export registration.
86225eb is described below

commit 86225eb2dd5b23d5e9896d12fbfb70cf04fd1996
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Tue May 18 13:10:52 2021 +0200

    Change start service tracker to async for rsa import/export registration.
---
 .../gtest/src/rsa_tests.cc                         |  1 +
 .../src/export_registration_dfi.c                  |  8 ++++----
 .../rsa_common/src/remote_interceptors_handler.c   | 10 ++++++----
 libs/framework/src/bundle_context.c                | 23 ++++++++++++++++++++++
 libs/framework/src/bundle_context_private.h        |  2 +-
 5 files changed, 35 insertions(+), 9 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 037a4e6..c0c6b7e 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
@@ -144,6 +144,7 @@ extern "C" {
         bool called = celix_bundleContext_useServiceWithOptions(context, &opts);
         ASSERT_TRUE(called);
 
+        celix_framework_waitForEmptyEventQueue(celix_bundleContext_getFramework(context));
         long svcId = celix_bundleContext_findService(context, "org.apache.celix.Example");
         EXPECT_GE(svcId, 0);
 
diff --git a/bundles/remote_services/remote_service_admin_dfi/src/export_registration_dfi.c b/bundles/remote_services/remote_service_admin_dfi/src/export_registration_dfi.c
index f63c39a..4f933ac 100644
--- a/bundles/remote_services/remote_service_admin_dfi/src/export_registration_dfi.c
+++ b/bundles/remote_services/remote_service_admin_dfi/src/export_registration_dfi.c
@@ -40,6 +40,7 @@ struct export_registration {
     struct export_reference exportReference;
     char *servId;
     dyn_interface_type *intf; //owner
+    char filter[32];
 
 
     celix_thread_mutex_t mutex;
@@ -259,16 +260,15 @@ void exportRegistration_destroy(export_registration_t *reg) {
 celix_status_t exportRegistration_start(export_registration_t *reg) {
     celix_status_t status = CELIX_SUCCESS;
 
-    char filter[32];
-    snprintf(filter, 32, "(service.id=%s)", reg->servId);
+    snprintf(reg->filter, 32, "(service.id=%s)", reg->servId);
     celix_service_tracking_options_t opts = CELIX_EMPTY_SERVICE_TRACKING_OPTIONS;
-    opts.filter.filter = filter;
+    opts.filter.filter = reg->filter;
     opts.filter.serviceName = "*";
     opts.filter.ignoreServiceLanguage = true;
     opts.callbackHandle = reg;
     opts.add = exportRegistration_addServ;
     opts.remove = exportRegistration_removeServ;
-    long newTrkId = celix_bundleContext_trackServicesWithOptions(reg->context, &opts);
+    long newTrkId = celix_bundleContext_trackServicesWithOptionsAsync(reg->context, &opts);
 
     celixThreadMutex_lock(&reg->mutex);
     long prevTrkId = reg->trackerId;
diff --git a/bundles/remote_services/rsa_common/src/remote_interceptors_handler.c b/bundles/remote_services/rsa_common/src/remote_interceptors_handler.c
index 08ff711..c1f830f 100644
--- a/bundles/remote_services/rsa_common/src/remote_interceptors_handler.c
+++ b/bundles/remote_services/rsa_common/src/remote_interceptors_handler.c
@@ -65,20 +65,22 @@ celix_status_t remoteInterceptorsHandler_create(celix_bundle_context_t *ctx, rem
             opts.callbackHandle = *handler;
             opts.addWithProperties = remoteInterceptorsHandler_addInterceptor;
             opts.removeWithProperties = remoteInterceptorsHandler_removeInterceptor;
-            (*handler)->interceptorsTrackerId = celix_bundleContext_trackServicesWithOptions(ctx, &opts);
+            (*handler)->interceptorsTrackerId = celix_bundleContext_trackServicesWithOptionsAsync(ctx, &opts);
         }
     }
 
     return status;
 }
 
-celix_status_t remoteInterceptorsHandler_destroy(remote_interceptors_handler_t *handler) {
-    celix_bundleContext_stopTracker(handler->ctx, handler->interceptorsTrackerId);
-
+static void remoteInterceptorsHandler_destroyCallback(void* data) {
+    remote_interceptors_handler_t *handler = data;
     celix_arrayList_destroy(handler->interceptors);
     celixThreadMutex_destroy(&handler->lock);
     free(handler);
+}
 
+celix_status_t remoteInterceptorsHandler_destroy(remote_interceptors_handler_t *handler) {
+    celix_bundleContext_stopTrackerAsync(handler->ctx, handler->interceptorsTrackerId, handler, remoteInterceptorsHandler_destroyCallback);
     return CELIX_SUCCESS;
 }
 
diff --git a/libs/framework/src/bundle_context.c b/libs/framework/src/bundle_context.c
index 1f1831d..23cffdd 100644
--- a/libs/framework/src/bundle_context.c
+++ b/libs/framework/src/bundle_context.c
@@ -899,6 +899,11 @@ static void celix_bundleContext_removeServiceTracker(void *data) {
     celixThreadMutex_lock(&tracker->ctx->mutex);
     hashMap_remove(tracker->ctx->stoppingTrackerEventIds, (void*)tracker->trackerId);
     celixThreadMutex_unlock(&tracker->ctx->mutex);
+    if (tracker->isFreeFilterNeeded) {
+        free((char*)tracker->opts.filter.serviceName);
+        free((char*)tracker->opts.filter.versionRange);
+        free((char*)tracker->opts.filter.filter);
+    }
     free(tracker);
 }
 
@@ -959,6 +964,11 @@ static void celix_bundleContext_stopTrackerInternal(bundle_context_t *ctx, long
             free(bundleTracker);
         } else if (serviceTracker != NULL) {
             celix_serviceTracker_destroy(serviceTracker->tracker);
+            if (serviceTracker->isFreeFilterNeeded) {
+                free((char*)serviceTracker->opts.filter.serviceName);
+                free((char*)serviceTracker->opts.filter.versionRange);
+                free((char*)serviceTracker->opts.filter.filter);
+            }
             free(serviceTracker);
         } else if (svcTrackerTracker != NULL) {
             celix_framework_unregister(ctx->framework, ctx->bundle, svcTrackerTracker->serviceId);
@@ -1383,6 +1393,11 @@ static void celix_bundleContext_doneCreatingTrackerOnEventLoop(void *data) {
     celixThreadMutex_unlock(&entry->ctx->mutex);
     if (cancelled) {
         //tracker creation cancelled -> entry already removed from map, but memory needs to be freed.
+        if (entry->isFreeFilterNeeded) {
+            free((char*)entry->opts.filter.serviceName);
+            free((char*)entry->opts.filter.versionRange);
+            free((char*)entry->opts.filter.filter);
+        }
         free(entry);
     } else if (entry->trackerCreatedCallback != NULL) {
         entry->trackerCreatedCallback(entry->trackerCreatedCallbackData);
@@ -1412,6 +1427,7 @@ static long celix_bundleContext_trackServicesWithOptionsInternal(celix_bundle_co
             entry->ctx = ctx;
             entry->tracker = tracker;
             entry->opts = *opts;
+            entry->isFreeFilterNeeded = false;
             entry->createEventId = -1;
             celixThreadMutex_lock(&ctx->mutex);
             entry->trackerId = ctx->nextTrackerId++;
@@ -1426,9 +1442,16 @@ static long celix_bundleContext_trackServicesWithOptionsInternal(celix_bundle_co
         entry->createEventId = celix_framework_nextEventId(ctx->framework);
         entry->tracker = NULL; //will be set async
         entry->opts = *opts;
+
         if (async) { //note only setting the async callback if this is a async call
             entry->trackerCreatedCallbackData = opts->trackerCreatedCallbackData;
             entry->trackerCreatedCallback = opts->trackerCreatedCallback;
+
+            //for async copying the const char* inputs
+            entry->isFreeFilterNeeded = true;
+            entry->opts.filter.serviceName = celix_utils_strdup(opts->filter.serviceName);
+            entry->opts.filter.versionRange = celix_utils_strdup(opts->filter.versionRange);
+            entry->opts.filter.filter = celix_utils_strdup(opts->filter.filter);
         }
         celixThreadMutex_lock(&ctx->mutex);
         entry->trackerId = ctx->nextTrackerId++;
diff --git a/libs/framework/src/bundle_context_private.h b/libs/framework/src/bundle_context_private.h
index 6e6d9e5..22c72f5 100644
--- a/libs/framework/src/bundle_context_private.h
+++ b/libs/framework/src/bundle_context_private.h
@@ -47,7 +47,7 @@ typedef struct celix_bundle_context_service_tracker_entry {
 	celix_service_tracker_t* tracker;
     void *trackerCreatedCallbackData;
     void (*trackerCreatedCallback)(void *trackerCreatedCallbackData);
-
+    bool isFreeFilterNeeded;
 
     //used for sync
     long createEventId;