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 2019/08/27 19:53:16 UTC
[celix] branch develop updated: CELIX-464: Some small improvments
in the dep man
This is an automated email from the ASF dual-hosted git repository.
pnoltes pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/celix.git
The following commit(s) were added to refs/heads/develop by this push:
new 67910a2 CELIX-464: Some small improvments in the dep man
67910a2 is described below
commit 67910a2f09cf351ba37701739413118e182f6e7f
Author: Pepijn Noltes <pe...@gmail.com>
AuthorDate: Tue Aug 27 21:49:45 2019 +0200
CELIX-464: Some small improvments in the dep man
---
libs/framework/include/celix/dm/DependencyManager.h | 13 ++++++++++---
libs/framework/include/celix_dependency_manager.h | 5 +++++
libs/framework/include/celix_dm_component.h | 2 ++
libs/framework/src/dm_component_impl.c | 6 ++++++
libs/framework/src/dm_dependency_manager_impl.c | 19 +++++++++++++++++++
5 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/libs/framework/include/celix/dm/DependencyManager.h b/libs/framework/include/celix/dm/DependencyManager.h
index c00872d..eed174d 100644
--- a/libs/framework/include/celix/dm/DependencyManager.h
+++ b/libs/framework/include/celix/dm/DependencyManager.h
@@ -131,9 +131,16 @@ namespace celix { namespace dm {
* Stops the Dependency Manager
*/
void stop() {
- celix_dependencyManager_removeAllComponents(cDepMan);
- queuedComponents.clear();
- startedComponents.clear();
+ std::vector<std::unique_ptr<BaseComponent>> clearStarted{};
+ std::vector<std::unique_ptr<BaseComponent>> clearQueued{};
+ celix_dependencyManager_removeAllComponents(cDepMan);
+ {
+ std::lock_guard<std::recursive_mutex> lock(componentsMutex);
+ std::swap(startedComponents, clearStarted);
+ std::swap(queuedComponents, clearQueued);
+ }
+ clearStarted.clear();
+ clearQueued.clear();
}
private:
celix_bundle_context_t *context {nullptr};
diff --git a/libs/framework/include/celix_dependency_manager.h b/libs/framework/include/celix_dependency_manager.h
index e850d0a..82ee3a1 100644
--- a/libs/framework/include/celix_dependency_manager.h
+++ b/libs/framework/include/celix_dependency_manager.h
@@ -70,6 +70,11 @@ celix_dependency_manager_info_t* celix_dependencyManager_createInfo(celix_depend
celix_array_list_t * /*celix_dependency_manager_info_t entries*/ celix_dependencyManager_createInfos(celix_dependency_manager_t *manager);
/**
+ * Check if all components - for all bundles - are active (all required dependencies resolved).
+ */
+bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *manager);
+
+/**
* Destroys a DM info struct.
*/
void celix_dependencyManager_destroyInfo(celix_dependency_manager_t *manager, celix_dependency_manager_info_t *info);
diff --git a/libs/framework/include/celix_dm_component.h b/libs/framework/include/celix_dm_component.h
index 12bb06d..50b3750 100644
--- a/libs/framework/include/celix_dm_component.h
+++ b/libs/framework/include/celix_dm_component.h
@@ -142,6 +142,8 @@ celix_status_t celix_dmComponent_setCallbacks(celix_dm_component_t *component, c
*/
celix_status_t celix_dmComponent_getComponentInfo(celix_dm_component_t *component, dm_component_info_pt *info);
+bool celix_dmComponent_isActive(celix_dm_component_t *component);
+
/**
* Destroys a DM Component info struct.
*/
diff --git a/libs/framework/src/dm_component_impl.c b/libs/framework/src/dm_component_impl.c
index 45406d1..072910c 100644
--- a/libs/framework/src/dm_component_impl.c
+++ b/libs/framework/src/dm_component_impl.c
@@ -1533,3 +1533,9 @@ void celix_dmComponent_destroyComponentInfo(dm_component_info_pt info) {
}
free(info);
}
+
+bool celix_dmComponent_isActive(celix_dm_component_t *component) {
+ pthread_mutex_lock(&component->mutex);
+ return component->active;
+ pthread_mutex_unlock(&component->mutex);
+}
diff --git a/libs/framework/src/dm_dependency_manager_impl.c b/libs/framework/src/dm_dependency_manager_impl.c
index b306335..3b0aa0f 100644
--- a/libs/framework/src/dm_dependency_manager_impl.c
+++ b/libs/framework/src/dm_dependency_manager_impl.c
@@ -164,6 +164,25 @@ celix_array_list_t * celix_dependencyManager_createInfos(celix_dependency_manage
return infos;
}
+static void celix_dm_allComponentsActiveCallback(void *handle, const celix_bundle_t *bnd) {
+ bool *allActivePtr = handle;
+ celix_bundle_context_t *context = NULL;
+ bundle_getContext((celix_bundle_t*)bnd, &context);
+ celix_dependency_manager_t *mng = celix_bundleContext_getDependencyManager(context);
+ int size = celix_arrayList_size(mng->components);
+ for (int i = 0; i < size; i += 1) {
+ celix_dm_component_t *cmp = celix_arrayList_get(mng->components, i);
+ if (!celix_dmComponent_isActive(cmp)) {
+ *allActivePtr = false;
+ }
+ }
+}
+
+bool celix_dependencyManager_allComponentsActive(celix_dependency_manager_t *manager) {
+ bool allActive = true;
+ celix_bundleContext_useBundles(manager->ctx, &allActive, celix_dm_allComponentsActiveCallback);
+ return allActive;
+}
void celix_dependencyManager_destroyInfo(celix_dependency_manager_t *manager __attribute__((unused)), celix_dependency_manager_info_t *info) {
for (int i = 0; i < celix_arrayList_size(info->components); i += 1) {