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(®->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;