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;
+}

Reply via email to