This is an automated email from the ASF dual-hosted git repository. pnoltes pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/celix.git
commit c8b18d8c2fdde85a981c294324ec32beb63afd2a Author: Deedss <[email protected]> AuthorDate: Tue Apr 14 14:27:19 2026 +0000 Introduce internal availability function, update documentation, improve memory layout of celix_dm_service_dependency_info_struct. --- documents/components.md | 17 ++++++++++------- .../benchmark/src/DependencyManagerBenchmark.cc | 2 -- libs/framework/include/celix_dm_info.h | 6 +++--- libs/framework/src/dm_service_dependency.c | 14 +++++++++++--- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/documents/components.md b/documents/components.md index 2b78893db..6d73c4c6e 100644 --- a/documents/components.md +++ b/documents/components.md @@ -476,14 +476,16 @@ Remarks for the C example: 5. Configures for which service name the service dependency will track services for. Optionally it is also possible to fine tune the tracked service by providing a service version range and/or service filter. 6. Configures the update strategy for the service dependency to suspend-strategy. -7. Configures the service dependency as a required service dependency. +7. Configures the service dependency as a required service dependency by setting the minimalCardinality to at least `1`. + Setting the minimalCardinality determines howmany services are required for the service dependency to be available. 8. Creates an empty service dependency callback options struct. This struct can be used to configure different service dependency callbacks. 9. Configures the `set` service dependency callback to `componentWithServiceDependency_setHighestRankingShellCommand` 10. Configures the dependency manager to use the callbacks configures in opts. 11. Adds the DM service dependency object to the DM component object. 12. Configures the update strategy for the service dependency to locking-strategy. -13. Configures the service dependency as an optional service dependency. +13. Configures the service dependency as an optional service dependency by setting the minimalCardinality to `0`. By + default, minimalCardinality is set to `0`. 14. Configures the `addWithProps` service dependency callback to `componentWithServiceDependency_addShellCommand`. ```C @@ -564,7 +566,7 @@ static celix_status_t componentWithServiceDependencyActivator_start(component_wi celix_dm_service_dependency_t* dep1 = celix_dmServiceDependency_create(); // <-----------------------------------<4> celix_dmServiceDependency_setService(dep1, CELIX_SHELL_COMMAND_SERVICE_NAME, NULL, NULL); // <-------------------<5> celix_dmServiceDependency_setStrategy(dep1, DM_SERVICE_DEPENDENCY_STRATEGY_SUSPEND); // <------------------------<6> - celix_dmServiceDependency_setRequired(dep1, true); // <----------------------------------------------------------<7> + celix_dmServiceDependency_setMinimalCardinality(dep1, 1); // <---------------------------------------------------<7> celix_dm_service_dependency_callback_options_t opts1 = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS; // <--<8> opts1.set = (void*)componentWithServiceDependency_setHighestRankingShellCommand; // <----------------------------<9> celix_dmServiceDependency_setCallbacksWithOptions(dep1, &opts1); // <-------------------------------------------<10> @@ -574,7 +576,7 @@ static celix_status_t componentWithServiceDependencyActivator_start(component_wi celix_dm_service_dependency_t* dep2 = celix_dmServiceDependency_create(); celix_dmServiceDependency_setService(dep2, CELIX_SHELL_COMMAND_SERVICE_NAME, NULL, NULL); celix_dmServiceDependency_setStrategy(dep2, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING); // <----------------------<12> - celix_dmServiceDependency_setRequired(dep2, false); // <--------------------------------------------------------<13> + celix_dmServiceDependency_setMinimalCardinality(dep2, 0); // <--------------------------------------------------<13> celix_dm_service_dependency_callback_options_t opts2 = CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS; opts2.addWithProps = (void*)componentWithServiceDependency_addShellCommand; // <-------------------------------<14> opts2.removeWithProps = (void*)componentWithServiceDependency_removeShellCommand; @@ -622,7 +624,8 @@ Remarks for the C++ example: service dependency, component or DM is build. Note that the `celix::dm::Component::createServiceDependency` method is called without provided a service name, the service name will be inferred using the `celix::typeName`. 5. Configures the service dependency set callback. -6. Configures the service dependency as a required service dependency. +6. Configures the service dependency as a required service dependency by setting the minimalCardinality to at least `1`. + Setting the minimalCardinality determines howmany services are required for the service dependency to be available. 7. Configures the update strategy for the service dependency to suspend-strategy. 8. Creates another new DM service dependency object and in this case also explicitly provides the service name to use (`CELIX_SHELL_COMMAND_SERVICE_NAME`). @@ -672,12 +675,12 @@ public: cmp.createServiceDependency<celix::IShellCommand>() // <-----------------------------------------------------<4> .setCallbacks(&Cmp::setHighestRankingShellCommand) // <----------------------------------------------<5> - .setRequired(true) // <------------------------------------------------------------------------------<6> + .setMinimalCardinality(1) // <-----------------------------------------------------------------------<6> .setStrategy(DependencyUpdateStrategy::suspend); // <------------------------------------------------<7> cmp.createServiceDependency<celix_shell_command_t>(CELIX_SHELL_COMMAND_SERVICE_NAME) // <--------------------<8> .setCallbacks(&Cmp::addCShellCmd, &Cmp::removeCShellCmd) - .setRequired(false) + .setMinimalCardinality(0) .setStrategy(DependencyUpdateStrategy::locking); cmp.build(); // <--------------------------------------------------------------------------------------------<9> diff --git a/libs/framework/benchmark/src/DependencyManagerBenchmark.cc b/libs/framework/benchmark/src/DependencyManagerBenchmark.cc index 0a52a322c..502eb94f6 100644 --- a/libs/framework/benchmark/src/DependencyManagerBenchmark.cc +++ b/libs/framework/benchmark/src/DependencyManagerBenchmark.cc @@ -17,8 +17,6 @@ * under the License. */ -#include "../../include/celix_dm_service_dependency.h" - #include "celix/FrameworkFactory.h" #include <benchmark/benchmark.h> diff --git a/libs/framework/include/celix_dm_info.h b/libs/framework/include/celix_dm_info.h index eaece5950..f1f5435ca 100644 --- a/libs/framework/include/celix_dm_info.h +++ b/libs/framework/include/celix_dm_info.h @@ -42,10 +42,10 @@ struct celix_dm_service_dependency_info_struct { char *serviceName; char *filter; char *versionRange; - bool available; + size_t count; size_t minimalCardinality; + bool available; bool required; - size_t count; }; typedef struct celix_dm_service_dependency_info_struct *dm_service_dependency_info_pt; //deprecated typedef struct celix_dm_service_dependency_info_struct dm_service_dependency_info_t; //deprecated @@ -56,8 +56,8 @@ struct celix_dm_component_info_struct { char* bundleSymbolicName; char* id; char* name; - bool active; char* state; + bool active; size_t nrOfTimesStarted; size_t nrOfTimesResumed; celix_array_list_t *interfaces; // type dm_interface_info_t* diff --git a/libs/framework/src/dm_service_dependency.c b/libs/framework/src/dm_service_dependency.c index 876a58974..afd1d378d 100644 --- a/libs/framework/src/dm_service_dependency.c +++ b/libs/framework/src/dm_service_dependency.c @@ -33,6 +33,7 @@ static void serviceDependency_addServiceTrackerCallback(void *handle, void *svc, static void serviceDependency_removeServiceTrackerCallback(void *handle, void *svc, const celix_properties_t *props); static void serviceDependency_setServiceTrackerCallback(void *handle, void *svc, const celix_properties_t *props); static void* serviceDependency_getCallbackHandle(celix_dm_service_dependency_t *dep); +static bool serviceDependency_isAvailable(celix_dm_service_dependency_t *dep); celix_status_t serviceDependency_create(celix_dm_service_dependency_t **dependency_ptr) { celix_dm_service_dependency_t *dep = celix_dmServiceDependency_create(); @@ -300,8 +301,7 @@ celix_status_t celix_dmServiceDependency_invokeRemove(celix_dm_service_dependenc bool celix_dmServiceDependency_isAvailable(celix_dm_service_dependency_t *dependency) { celixThreadMutex_lock(&dependency->mutex); - bool avail = (dependency->minimalCardinality == 0) ? (dependency->trackedSvcCount > 0) - : (dependency->trackedSvcCount >= dependency->minimalCardinality); + bool avail = serviceDependency_isAvailable(dependency); celixThreadMutex_unlock(&dependency->mutex); return avail; } @@ -338,7 +338,7 @@ dm_service_dependency_info_t* celix_dmServiceDependency_createInfo(celix_dm_serv celix_dm_service_dependency_info_t* info = calloc(1, sizeof(*info)); if (info != NULL) { celixThreadMutex_lock(&dep->mutex); - info->available = (dep->minimalCardinality == 0) ? (dep->trackedSvcCount > 0) : dep->trackedSvcCount >= dep->minimalCardinality; + info->available = serviceDependency_isAvailable(dep); info->minimalCardinality = dep->minimalCardinality; info->serviceName = celix_utils_strdup(dep->serviceName); info->filter = celix_utils_strdup(dep->filter); @@ -376,3 +376,11 @@ celix_status_t celix_dmServiceDependency_setCallbackHandle(celix_dm_service_depe static void* serviceDependency_getCallbackHandle(celix_dm_service_dependency_t *dependency) { return dependency->callbackHandle == NULL ? component_getImplementation(dependency->component) : dependency->callbackHandle; } + +static bool serviceDependency_isAvailable(celix_dm_service_dependency_t* dep) { + if (dep->minimalCardinality == 0) { + return dep->trackedSvcCount > 0; + } + + return dep->trackedSvcCount >= dep->minimalCardinality; +}
