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;
 

Reply via email to