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 4695d4bf556cb8d9dea7291394620c64239de18a Author: Deedss <[email protected]> AuthorDate: Wed Apr 8 19:08:50 2026 +0000 Rework minimalCardinality to influence whether a service is required or not. --- .../baz/src/BazActivator.cc | 3 +- .../foo/src/FooActivator.cc | 3 +- .../dm_example/phase2a/src/phase2a_activator.c | 2 +- .../dm_example/phase2b/src/phase2b_activator.c | 2 +- .../dm_example/phase3/src/phase3_activator.c | 2 +- .../dm_example_cxx/phase2/src/Phase2aActivator.cc | 3 +- .../dm_example_cxx/phase2/src/Phase2bActivator.cc | 3 +- .../dm_example_cxx/phase3/src/Phase3Activator.cc | 1 - .../phase3/src/Phase3BaseActivator.cc | 2 +- .../component_with_service_dependency_activator.c | 4 +- .../src/ComponentWithServiceDependencyActivator.cc | 3 +- .../framework/include/celix/dm/ServiceDependency.h | 20 +-- .../include/celix/dm/ServiceDependency_Impl.h | 13 -- .../include/celix_dm_service_dependency.h | 10 +- .../include_deprecated/dm_service_dependency.h | 5 - libs/framework/src/dm_service_dependency.c | 177 ++++++++++----------- libs/framework/src/dm_service_dependency_impl.h | 1 - 17 files changed, 103 insertions(+), 151 deletions(-) diff --git a/examples/celix-examples/dependency_manager_example_cxx/baz/src/BazActivator.cc b/examples/celix-examples/dependency_manager_example_cxx/baz/src/BazActivator.cc index a7023ccba..d80326e78 100644 --- a/examples/celix-examples/dependency_manager_example_cxx/baz/src/BazActivator.cc +++ b/examples/celix-examples/dependency_manager_example_cxx/baz/src/BazActivator.cc @@ -28,13 +28,12 @@ public: .setCallbacks(nullptr, &Baz::start, &Baz::stop, nullptr); cmp.createServiceDependency<IAnotherExample>() - .setRequired(true) + .setMinimalCardinality(1) .setStrategy(DependencyUpdateStrategy::locking) .setVersionRange(IANOTHER_EXAMPLE_CONSUMER_RANGE) .setCallbacks(&Baz::addAnotherExample, &Baz::removeAnotherExample); cmp.createCServiceDependency<example_t>(EXAMPLE_NAME) - .setRequired(false) .setStrategy(DependencyUpdateStrategy::locking) .setVersionRange(EXAMPLE_CONSUMER_RANGE) .setCallbacks(&Baz::addExample, &Baz::removeExample); diff --git a/examples/celix-examples/dependency_manager_example_cxx/foo/src/FooActivator.cc b/examples/celix-examples/dependency_manager_example_cxx/foo/src/FooActivator.cc index af79f4a8d..c558c8056 100644 --- a/examples/celix-examples/dependency_manager_example_cxx/foo/src/FooActivator.cc +++ b/examples/celix-examples/dependency_manager_example_cxx/foo/src/FooActivator.cc @@ -29,12 +29,11 @@ public: .setCallbacks(nullptr, &Foo::start, &Foo::stop, nullptr); cmp.createServiceDependency<IAnotherExample>() - .setRequired(true) + .setMinimalCardinality(1) .setVersionRange(IANOTHER_EXAMPLE_CONSUMER_RANGE) .setCallbacks(&Foo::setAnotherExample); cmp.createCServiceDependency<example_t>(EXAMPLE_NAME) - .setRequired(false) .setVersionRange(EXAMPLE_CONSUMER_RANGE) .setCallbacks(&Foo::setExample); } diff --git a/examples/celix-examples/dm_example/phase2a/src/phase2a_activator.c b/examples/celix-examples/dm_example/phase2a/src/phase2a_activator.c index f0849b770..e4bb33a71 100644 --- a/examples/celix-examples/dm_example/phase2a/src/phase2a_activator.c +++ b/examples/celix-examples/dm_example/phase2a/src/phase2a_activator.c @@ -56,7 +56,7 @@ static celix_status_t activator_start(struct phase2a_activator_struct *act, celi celix_dmServiceDependency_setService(dep, PHASE1_NAME, PHASE1_RANGE_ALL, NULL); celix_dmServiceDependency_setCallback(dep, (void*)phase2a_setPhase1); celix_dmServiceDependency_setStrategy(dep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING); - celix_dmServiceDependency_setRequired(dep, true); + celix_dmServiceDependency_setMinimalCardinality(dep, 1); celix_dmComponent_addServiceDependency(cmp, dep); celix_dependency_manager_t *mng = celix_bundleContext_getDependencyManager(ctx); diff --git a/examples/celix-examples/dm_example/phase2b/src/phase2b_activator.c b/examples/celix-examples/dm_example/phase2b/src/phase2b_activator.c index c912aed33..38679f2bc 100644 --- a/examples/celix-examples/dm_example/phase2b/src/phase2b_activator.c +++ b/examples/celix-examples/dm_example/phase2b/src/phase2b_activator.c @@ -56,7 +56,7 @@ static celix_status_t activator_start(struct phase2b_activator_struct *act, celi celix_dm_service_dependency_t *dep = celix_dmServiceDependency_create(); celix_dmServiceDependency_setService(dep, PHASE1_NAME, PHASE1_RANGE_EXACT, NULL); celix_dmServiceDependency_setCallback(dep, (void*)phase2b_setPhase1); - celix_dmServiceDependency_setRequired(dep, true); + celix_dmServiceDependency_setMinimalCardinality(dep, 1); celix_dmServiceDependency_setStrategy(dep, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING); celix_dmComponent_addServiceDependency(cmp, dep); diff --git a/examples/celix-examples/dm_example/phase3/src/phase3_activator.c b/examples/celix-examples/dm_example/phase3/src/phase3_activator.c index 33a7bd1e8..be7fc7f37 100644 --- a/examples/celix-examples/dm_example/phase3/src/phase3_activator.c +++ b/examples/celix-examples/dm_example/phase3/src/phase3_activator.c @@ -47,7 +47,7 @@ static celix_status_t activator_start(struct phase3_activator_struct *act, celix opts.add = (void*)phase3_addPhase2; opts.remove = (void*)phase3_removePhase2; celix_dmServiceDependency_setCallbacksWithOptions(dep, &opts); - celix_dmServiceDependency_setRequired(dep, true); + celix_dmServiceDependency_setMinimalCardinality(dep, 1); celix_dmComponent_addServiceDependency(cmp, dep); celix_dependency_manager_t *mng = celix_bundleContext_getDependencyManager(ctx); diff --git a/examples/celix-examples/dm_example_cxx/phase2/src/Phase2aActivator.cc b/examples/celix-examples/dm_example_cxx/phase2/src/Phase2aActivator.cc index 150b36ba5..3dbe0bf7e 100644 --- a/examples/celix-examples/dm_example_cxx/phase2/src/Phase2aActivator.cc +++ b/examples/celix-examples/dm_example_cxx/phase2/src/Phase2aActivator.cc @@ -36,7 +36,7 @@ public: .addInterface<IPhase2>(IPHASE2_VERSION, props); cmp.createServiceDependency<IPhase1>() - .setRequired(true) + .setMinimalCardinality(1) .setCallbacks(&Phase2Cmp::setPhase1); cmp.createServiceDependency<srv::info::IName>() @@ -44,7 +44,6 @@ public: .setCallbacks(&Phase2Cmp::setName); cmp.createCServiceDependency<celix_log_service_t>(CELIX_LOG_SERVICE_NAME) - .setRequired(false) .setCallbacks(&Phase2Cmp::setLogService); } }; diff --git a/examples/celix-examples/dm_example_cxx/phase2/src/Phase2bActivator.cc b/examples/celix-examples/dm_example_cxx/phase2/src/Phase2bActivator.cc index 9c09cc969..977d914e8 100644 --- a/examples/celix-examples/dm_example_cxx/phase2/src/Phase2bActivator.cc +++ b/examples/celix-examples/dm_example_cxx/phase2/src/Phase2bActivator.cc @@ -32,11 +32,10 @@ public: .addInterface<IPhase2>(IPHASE2_VERSION, props); cmp.createServiceDependency<IPhase1>() - .setRequired(true) + .setMinimalCardinality(1) .setCallbacks(&Phase2Cmp::setPhase1); cmp.createCServiceDependency<celix_log_service_t>(CELIX_LOG_SERVICE_NAME) - .setRequired(false) .setCallbacks(&Phase2Cmp::setLogService); } }; diff --git a/examples/celix-examples/dm_example_cxx/phase3/src/Phase3Activator.cc b/examples/celix-examples/dm_example_cxx/phase3/src/Phase3Activator.cc index 3c3e0e3aa..ae7e4e259 100644 --- a/examples/celix-examples/dm_example_cxx/phase3/src/Phase3Activator.cc +++ b/examples/celix-examples/dm_example_cxx/phase3/src/Phase3Activator.cc @@ -26,7 +26,6 @@ using namespace celix::dm; Phase3Activator::Phase3Activator(std::shared_ptr<DependencyManager> mng) : Phase3BaseActivator{mng} { cmp.createServiceDependency<IPhase2>() - .setRequired(false) .setFilter("(&(name=phase2a)(non-existing=*))") .setCallbacks(&Phase3Cmp::setPhase2a); } diff --git a/examples/celix-examples/dm_example_cxx/phase3/src/Phase3BaseActivator.cc b/examples/celix-examples/dm_example_cxx/phase3/src/Phase3BaseActivator.cc index dc8f85a13..815a9585d 100644 --- a/examples/celix-examples/dm_example_cxx/phase3/src/Phase3BaseActivator.cc +++ b/examples/celix-examples/dm_example_cxx/phase3/src/Phase3BaseActivator.cc @@ -26,6 +26,6 @@ Phase3BaseActivator::Phase3BaseActivator(std::shared_ptr<DependencyManager> mng) cmp.setCallbacks(nullptr, &Phase3Cmp::start, &Phase3Cmp::stop, nullptr); cmp.createServiceDependency<IPhase2>() - .setRequired(true) + .setMinimalCardinality(1) .setCallbacks(&Phase3Cmp::addPhase2, &Phase3Cmp::removePhase2); } diff --git a/examples/celix-examples/readme_c_examples/src/component_with_service_dependency_activator.c b/examples/celix-examples/readme_c_examples/src/component_with_service_dependency_activator.c index c0ccfc3a1..bf1261982 100644 --- a/examples/celix-examples/readme_c_examples/src/component_with_service_dependency_activator.c +++ b/examples/celix-examples/readme_c_examples/src/component_with_service_dependency_activator.c @@ -94,7 +94,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> @@ -104,7 +104,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; diff --git a/examples/celix-examples/readme_cxx_examples/src/ComponentWithServiceDependencyActivator.cc b/examples/celix-examples/readme_cxx_examples/src/ComponentWithServiceDependencyActivator.cc index 1ba315001..0dbf0e6a2 100644 --- a/examples/celix-examples/readme_cxx_examples/src/ComponentWithServiceDependencyActivator.cc +++ b/examples/celix-examples/readme_cxx_examples/src/ComponentWithServiceDependencyActivator.cc @@ -60,12 +60,11 @@ public: cmp.createServiceDependency<celix::IShellCommand>() .setCallbacks(&Cmp::setHighestRankingShellCommand) - .setRequired(true) + .setMinimalCardinality(1) .setStrategy(DependencyUpdateStrategy::suspend); cmp.createServiceDependency<celix_shell_command_t>(CELIX_SHELL_COMMAND_SERVICE_NAME) .setCallbacks(&Cmp::addCShellCmd, &Cmp::removeCShellCmd) - .setRequired(false) .setStrategy(DependencyUpdateStrategy::locking); cmp.build(); // <--------------------------------------------------------------------------------------------<8> diff --git a/libs/framework/include/celix/dm/ServiceDependency.h b/libs/framework/include/celix/dm/ServiceDependency.h index 37e137edc..3245624f4 100644 --- a/libs/framework/include/celix/dm/ServiceDependency.h +++ b/libs/framework/include/celix/dm/ServiceDependency.h @@ -159,14 +159,10 @@ namespace celix { namespace dm { CServiceDependency<T,I>& setFilter(const std::string &filter); /** - * Specify if the service dependency is required. Default is false + * Specify the minimum number of services the service dependency requires before being counted as available. * - * @return the C service dependency reference for chaining (fluent API) - */ - CServiceDependency<T,I>& setRequired(bool req); - - /** - * Specify the minimum amount of service dependencies required to be available + * The minimal cardinality also affects whether a service is required. By default, the minimal cardinality is 0, + * implying that a service is not required. * * @return the C service dependency reference for chaining (fluent API) */ @@ -410,14 +406,10 @@ namespace celix { namespace dm { std::function<void(const std::shared_ptr<I>& service)> remove); /** - * Specify if the service dependency is required. Default is false + * Specify the minimum number of services the service dependency requires before being counted as available. * - * @return the service dependency reference for chaining (fluent API) - */ - ServiceDependency<T,I>& setRequired(bool req); - - /** - * Specify the minimum amount of service dependencies required to be available + * The minimal cardinality also affects whether a service is required. By default, the minimal cardinality is 0, + * implying that a service is not required. * * @return the service dependency reference for chaining (fluent API) */ diff --git a/libs/framework/include/celix/dm/ServiceDependency_Impl.h b/libs/framework/include/celix/dm/ServiceDependency_Impl.h index 8b0a95f52..25f4e99a3 100644 --- a/libs/framework/include/celix/dm/ServiceDependency_Impl.h +++ b/libs/framework/include/celix/dm/ServiceDependency_Impl.h @@ -112,12 +112,6 @@ void CServiceDependency<T,I>::setupService() { celix_dmServiceDependency_setService(this->cServiceDependency(), this->name.c_str(), cversion, cfilter); } -template<class T, typename I> -CServiceDependency<T,I>& CServiceDependency<T,I>::setRequired(bool req) { - celix_dmServiceDependency_setRequired(this->cServiceDependency(), req); - return *this; -} - template<class T, typename I> CServiceDependency<T,I>& CServiceDependency<T,I>::setMinimalCardinality(size_t minimalCardinality) { celix_dmServiceDependency_setMinimalCardinality(this->cServiceDependency(), minimalCardinality); @@ -467,13 +461,6 @@ ServiceDependency<T,I>& ServiceDependency<T,I>::setCallbacks( return *this; } - -template<class T, class I> -ServiceDependency<T,I>& ServiceDependency<T,I>::setRequired(bool req) { - celix_dmServiceDependency_setRequired(this->cServiceDependency(), req); - return *this; -} - template <class T, class I> ServiceDependency<T, I>& ServiceDependency<T, I>::setMinimalCardinality(size_t minimalCardinality) { celix_dmServiceDependency_setMinimalCardinality(this->cServiceDependency(), minimalCardinality); diff --git a/libs/framework/include/celix_dm_service_dependency.h b/libs/framework/include/celix_dm_service_dependency.h index 2c5c4c7d0..b17e07159 100644 --- a/libs/framework/include/celix_dm_service_dependency.h +++ b/libs/framework/include/celix_dm_service_dependency.h @@ -85,12 +85,10 @@ CELIX_FRAMEWORK_EXPORT void celix_dmServiceDependency_destroy(celix_dm_service_d CELIX_DEFINE_AUTOPTR_CLEANUP_FUNC(celix_dm_service_dependency_t, celix_dmServiceDependency_destroy); /** - * Specify if the service dependency is required. default is false - */ -CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setRequired(celix_dm_service_dependency_t *dependency, bool required); - -/** - * Specify the minimum number of services the service dependency requires before being available. + * Specify the minimum number of services the service dependency requires before being counted as available. + * + * The minimal cardinality also affects whether a service is required. By default, the minimal cardinality is 0, + * implying that a service is not required. */ CELIX_FRAMEWORK_EXPORT celix_status_t celix_dmServiceDependency_setMinimalCardinality(celix_dm_service_dependency_t *dependency, size_t minimalCardinality); diff --git a/libs/framework/include_deprecated/dm_service_dependency.h b/libs/framework/include_deprecated/dm_service_dependency.h index eba99c019..3a0976588 100644 --- a/libs/framework/include_deprecated/dm_service_dependency.h +++ b/libs/framework/include_deprecated/dm_service_dependency.h @@ -70,11 +70,6 @@ CELIX_FRAMEWORK_DEPRECATED_EXPORT celix_status_t serviceDependency_create(celix_ */ CELIX_FRAMEWORK_DEPRECATED_EXPORT celix_status_t serviceDependency_destroy(celix_dm_service_dependency_t **dep); -/** - * Specify if the service dependency is required. default is false - */ -CELIX_FRAMEWORK_DEPRECATED_EXPORT celix_status_t serviceDependency_setRequired(celix_dm_service_dependency_t *dependency, bool required); - /** * Specify if the service dependency update strategy. * diff --git a/libs/framework/src/dm_service_dependency.c b/libs/framework/src/dm_service_dependency.c index 33c045d23..665f0535f 100644 --- a/libs/framework/src/dm_service_dependency.c +++ b/libs/framework/src/dm_service_dependency.c @@ -45,19 +45,18 @@ celix_status_t serviceDependency_create(celix_dm_service_dependency_t **dependen } celix_dm_service_dependency_t* celix_dmServiceDependency_create() { - celix_dm_service_dependency_t *dep = calloc(1, sizeof(*dep)); - dep->strategy = DM_SERVICE_DEPENDENCY_DEFAULT_STRATEGY; - dep->svcTrackerId = -1; - dep->minimalCardinality = 1; - celixThreadMutex_create(&dep->mutex, NULL); + celix_dm_service_dependency_t* dep = calloc(1, sizeof(*dep)); + dep->strategy = DM_SERVICE_DEPENDENCY_DEFAULT_STRATEGY; + dep->svcTrackerId = -1; + celixThreadMutex_create(&dep->mutex, NULL); return dep; } celix_status_t serviceDependency_destroy(celix_dm_service_dependency_t **dependency_ptr) { - if (dependency_ptr != NULL) { - celix_dmServiceDependency_destroy(*dependency_ptr); - } - return CELIX_SUCCESS; + if (dependency_ptr != NULL) { + celix_dmServiceDependency_destroy(*dependency_ptr); + } + return CELIX_SUCCESS; } void celix_dmServiceDependency_destroy(celix_dm_service_dependency_t *dep) { @@ -78,54 +77,39 @@ void celix_dmServiceDependency_destroy(celix_dm_service_dependency_t *dep) { } } -celix_status_t serviceDependency_setRequired(celix_dm_service_dependency_t *dependency, bool required) { - return celix_dmServiceDependency_setRequired(dependency, required); -} - -celix_status_t celix_dmServiceDependency_setRequired(celix_dm_service_dependency_t *dependency, bool required) { - celix_status_t status = CELIX_SUCCESS; - - if (!dependency) { - status = CELIX_ILLEGAL_ARGUMENT; - } - - if (status == CELIX_SUCCESS) { - dependency->required = required; - } - - return status; -} - celix_status_t celix_dmServiceDependency_setMinimalCardinality(celix_dm_service_dependency_t *dependency, size_t minimalCardinality) { - if (minimalCardinality > 0) { + celix_status_t status = CELIX_SUCCESS; + if (!dependency) { + status = CELIX_ILLEGAL_ARGUMENT; + } else { dependency->minimalCardinality = minimalCardinality; } - return CELIX_SUCCESS; + return status; } celix_status_t serviceDependency_setStrategy(celix_dm_service_dependency_t *dependency, dm_service_dependency_strategy_t strategy) { - return celix_dmServiceDependency_setStrategy(dependency, strategy); + return celix_dmServiceDependency_setStrategy(dependency, strategy); } celix_status_t celix_dmServiceDependency_setStrategy(celix_dm_service_dependency_t *dependency, dm_service_dependency_strategy_t strategy) { dependency->strategy = strategy; - return CELIX_SUCCESS; + return CELIX_SUCCESS; } celix_status_t serviceDependency_getStrategy(celix_dm_service_dependency_t *dependency, dm_service_dependency_strategy_t* strategy) { - celix_dm_service_dependency_strategy_t str = celix_dmServiceDependency_getStrategy(dependency); - if (strategy != NULL) { - *strategy = str; - } - return CELIX_SUCCESS; + celix_dm_service_dependency_strategy_t str = celix_dmServiceDependency_getStrategy(dependency); + if (strategy != NULL) { + *strategy = str; + } + return CELIX_SUCCESS; } celix_dm_service_dependency_strategy_t celix_dmServiceDependency_getStrategy(celix_dm_service_dependency_t *dependency) { - return dependency->strategy; + return dependency->strategy; } celix_status_t serviceDependency_setService(celix_dm_service_dependency_t *dependency, const char* serviceName, const char* serviceVersionRange, const char* filter) { - return celix_dmServiceDependency_setService(dependency, serviceName, serviceVersionRange, filter); + return celix_dmServiceDependency_setService(dependency, serviceName, serviceVersionRange, filter); } celix_status_t celix_dmServiceDependency_setService(celix_dm_service_dependency_t *dependency, const char* serviceName, const char* serviceVersionRange, const char* filter) { @@ -145,15 +129,15 @@ celix_status_t celix_dmServiceDependency_setService(celix_dm_service_dependency_ } celix_status_t serviceDependency_getFilter(celix_dm_service_dependency_t *dependency, const char** filter) { - const char *f = celix_dmServiceDependency_getFilter(dependency); - if (filter != NULL) { - *filter = f; - } - return CELIX_SUCCESS; + const char* f = celix_dmServiceDependency_getFilter(dependency); + if (filter != NULL) { + *filter = f; + } + return CELIX_SUCCESS; } const char* celix_dmServiceDependency_getFilter(celix_dm_service_dependency_t *dependency) { - return (const char*)dependency->filter; + return (const char*)dependency->filter; } celix_status_t serviceDependency_setCallbacks(celix_dm_service_dependency_t *dependency, service_set_fpt set, service_add_fpt add, service_change_fpt change CELIX_UNUSED, service_remove_fpt remove, service_swap_fpt swap CELIX_UNUSED) { @@ -164,57 +148,55 @@ celix_status_t serviceDependency_setCallbacks(celix_dm_service_dependency_t *dep } celix_status_t celix_dmServiceDependency_setCallback(celix_dm_service_dependency_t *dependency, celix_dm_service_update_fp set) { - dependency->set = set; - return CELIX_SUCCESS; + dependency->set = set; + return CELIX_SUCCESS; } - celix_status_t celix_dmServiceDependency_setCallbackWithProperties(celix_dm_service_dependency_t *dependency, celix_dm_service_update_with_props_fp set) { - dependency->setWithProperties = set; - return CELIX_SUCCESS; + dependency->setWithProperties = set; + return CELIX_SUCCESS; } - celix_status_t celix_dmServiceDependency_setCallbacksWithOptions(celix_dm_service_dependency_t *dependency, const celix_dm_service_dependency_callback_options_t *opts) { - dependency->set = opts->set; - dependency->add = opts->add; - dependency->remove = opts->remove; + dependency->set = opts->set; + dependency->add = opts->add; + dependency->remove = opts->remove; - dependency->setWithProperties = opts->setWithProps; - dependency->addWithProperties = opts->addWithProps; - dependency->remWithProperties = opts->removeWithProps; - return CELIX_SUCCESS; + dependency->setWithProperties = opts->setWithProps; + dependency->addWithProperties = opts->addWithProps; + dependency->remWithProperties = opts->removeWithProps; + return CELIX_SUCCESS; } celix_status_t celix_dmServiceDependency_setComponent(celix_dm_service_dependency_t *dependency, celix_dm_component_t *component) { dependency->component = component; - return CELIX_SUCCESS; + return CELIX_SUCCESS; } celix_status_t celix_dmServiceDependency_enable(celix_dm_service_dependency_t* dependency) { - celix_bundle_context_t* ctx = celix_dmComponent_getBundleContext(dependency->component); + celix_bundle_context_t* ctx = celix_dmComponent_getBundleContext(dependency->component); - if (dependency->serviceName == NULL && dependency->filter == NULL) { - celix_bundleContext_log( - ctx, CELIX_LOG_LEVEL_ERROR, "Cannot start a service dependency without a service name and filter"); - return CELIX_ILLEGAL_ARGUMENT; - } + if (dependency->serviceName == NULL && dependency->filter == NULL) { + celix_bundleContext_log( + ctx, CELIX_LOG_LEVEL_ERROR, "Cannot start a service dependency without a service name and filter"); + return CELIX_ILLEGAL_ARGUMENT; + } - celixThreadMutex_lock(&dependency->mutex); - if (dependency->svcTrackerId == -1L) { - celix_service_tracking_options_t opts = CELIX_EMPTY_SERVICE_TRACKING_OPTIONS; - opts.filter.filter = dependency->filter; - opts.filter.serviceName = dependency->serviceName; - opts.filter.versionRange = dependency->versionRange; - opts.callbackHandle = dependency; - opts.addWithProperties = serviceDependency_addServiceTrackerCallback; - opts.removeWithProperties = serviceDependency_removeServiceTrackerCallback; - opts.setWithProperties = serviceDependency_setServiceTrackerCallback; - dependency->svcTrackerId = celix_bundleContext_trackServicesWithOptionsAsync(ctx, &opts); - } - celixThreadMutex_unlock(&dependency->mutex); + celixThreadMutex_lock(&dependency->mutex); + if (dependency->svcTrackerId == -1L) { + celix_service_tracking_options_t opts = CELIX_EMPTY_SERVICE_TRACKING_OPTIONS; + opts.filter.filter = dependency->filter; + opts.filter.serviceName = dependency->serviceName; + opts.filter.versionRange = dependency->versionRange; + opts.callbackHandle = dependency; + opts.addWithProperties = serviceDependency_addServiceTrackerCallback; + opts.removeWithProperties = serviceDependency_removeServiceTrackerCallback; + opts.setWithProperties = serviceDependency_setServiceTrackerCallback; + dependency->svcTrackerId = celix_bundleContext_trackServicesWithOptionsAsync(ctx, &opts); + } + celixThreadMutex_unlock(&dependency->mutex); - return CELIX_SUCCESS; + return CELIX_SUCCESS; } static void celix_serviceDependency_stopCallback(void *data) { @@ -234,7 +216,7 @@ celix_status_t celix_dmServiceDependency_disable(celix_dm_service_dependency_t * } celixThreadMutex_unlock(&dependency->mutex); - return CELIX_SUCCESS; + return CELIX_SUCCESS; } bool celix_dmServiceDependency_isDisabled(celix_dm_service_dependency_t *dependency) { @@ -318,13 +300,18 @@ 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->trackedSvcCount >= dependency->minimalCardinality; + bool avail = false; + if (dependency->minimalCardinality == 0) { + avail = dependency->trackedSvcCount > 0; + } else { + avail = dependency->trackedSvcCount >= dependency->minimalCardinality; + } celixThreadMutex_unlock(&dependency->mutex); return avail; } bool celix_dmServiceDependency_isRequired(const celix_dm_service_dependency_t* dep) { - return dep->required; + return dep->minimalCardinality > 0; } bool celix_dmServiceDependency_isTrackerOpen(celix_dm_service_dependency_t* dependency) { @@ -345,10 +332,10 @@ bool celix_dmServiceDependency_isAddRemCallbacksConfigured(celix_dm_service_depe } celix_status_t serviceDependency_getServiceDependencyInfo(celix_dm_service_dependency_t *dep, dm_service_dependency_info_t **out) { - if (out != NULL) { - *out = celix_dmServiceDependency_createInfo(dep); - } - return CELIX_SUCCESS; + if (out != NULL) { + *out = celix_dmServiceDependency_createInfo(dep); + } + return CELIX_SUCCESS; } dm_service_dependency_info_t* celix_dmServiceDependency_createInfo(celix_dm_service_dependency_t* dep) { @@ -360,7 +347,7 @@ dm_service_dependency_info_t* celix_dmServiceDependency_createInfo(celix_dm_serv info->serviceName = celix_utils_strdup(dep->serviceName); info->filter = celix_utils_strdup(dep->filter); info->versionRange = celix_utils_strdup(dep->versionRange); - info->required = dep->required; + info->required = dep->minimalCardinality > 0; info->count = dep->trackedSvcCount; celixThreadMutex_unlock(&dep->mutex); } @@ -369,24 +356,24 @@ dm_service_dependency_info_t* celix_dmServiceDependency_createInfo(celix_dm_serv void dependency_destroyDependencyInfo(dm_service_dependency_info_pt info) { - celix_dmServiceDependency_destroyInfo(NULL, info); + celix_dmServiceDependency_destroyInfo(NULL, info); } void celix_dmServiceDependency_destroyInfo(celix_dm_service_dependency_t *dep CELIX_UNUSED, dm_service_dependency_info_t *info) { - if (info != NULL) { - free(info->serviceName); - free(info->filter); - free(info->versionRange); - } - free(info); + if (info != NULL) { + free(info->serviceName); + free(info->filter); + free(info->versionRange); + } + free(info); } celix_status_t serviceDependency_setCallbackHandle(celix_dm_service_dependency_t *dependency, void* handle) { - return celix_dmServiceDependency_setCallbackHandle(dependency, handle); + return celix_dmServiceDependency_setCallbackHandle(dependency, handle); } celix_status_t celix_dmServiceDependency_setCallbackHandle(celix_dm_service_dependency_t *dependency, void* handle) { - dependency->callbackHandle = handle; + dependency->callbackHandle = handle; return CELIX_SUCCESS; } diff --git a/libs/framework/src/dm_service_dependency_impl.h b/libs/framework/src/dm_service_dependency_impl.h index eb705e394..1e5beb2bb 100644 --- a/libs/framework/src/dm_service_dependency_impl.h +++ b/libs/framework/src/dm_service_dependency_impl.h @@ -51,7 +51,6 @@ struct celix_dm_service_dependency { char* serviceName; char* filter; char* versionRange; - bool required; dm_service_dependency_strategy_t strategy; celix_dm_component_t* component;
