[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r572783249
##
File path: libs/utils/src/version_range.c
##
@@ -182,61 +108,139 @@ celix_status_t
versionRange_isHighInclusive(version_range_pt versionRange, bool
celix_status_t versionRange_parse(const char * rangeStr, version_range_pt
*range) {
-celix_status_t status;
-if (strchr(rangeStr, ',') != NULL) {
-int vlowL = strcspn(rangeStr+1, ",");
-char * vlow = (char *) malloc(sizeof(char) * (vlowL + 1));
-if (!vlow) {
-status = CELIX_ENOMEM;
-} else {
-int vhighL;
-char * vhigh;
-vlow = strncpy(vlow, rangeStr+1, vlowL);
-vlow[vlowL] = '\0';
-vhighL = strlen(rangeStr+1) - vlowL - 2;
-vhigh = (char *) malloc(sizeof(char) * (vhighL+1));
-if (!vhigh) {
-status = CELIX_ENOMEM;
-} else {
-version_pt versionLow = NULL;
-int rangeL = strlen(rangeStr);
-char start = rangeStr[0];
-char end = rangeStr[rangeL-1];
-
-vhigh = strncpy(vhigh, rangeStr+vlowL+2, vhighL);
-vhigh[vhighL] = '\0';
-status = version_createVersionFromString(vlow,
&versionLow);
-if (status == CELIX_SUCCESS) {
-version_pt versionHigh = NULL;
-status = version_createVersionFromString(vhigh,
&versionHigh);
-if (status == CELIX_SUCCESS) {
-status = versionRange_createVersionRange(
-versionLow,
-start == '[',
-versionHigh,
-end ==']',
-range
-);
-}
-}
-free(vhigh);
-}
-free(vlow);
+*range = celix_versionRange_parse(rangeStr);
+if (*range == NULL) {
+return CELIX_ILLEGAL_ARGUMENT;
+} else {
+return CELIX_SUCCESS;
+}
+}
+char* versionRange_createLDAPFilter(version_range_pt range, const char
*serviceVersionAttributeName) {
+return celix_versionRange_createLDAPFilter(range,
serviceVersionAttributeName);
+}
+
+
+
+bool versionRange_createLDAPFilterInPlace(version_range_pt range, const char
*serviceVersionAttributeName, char* buffer, size_t bufferLength) {
+return celix_versionRange_createLDAPFilterInPlace(range,
serviceVersionAttributeName, buffer, bufferLength);
+}
+
+celix_version_range_t* celix_versionRange_createVersionRange(celix_version_t*
low, bool isLowInclusive, celix_version_t* high, bool isHighInclusive) {
+assert(low != high);
+celix_version_range_t* range = malloc(sizeof(*range));
+range->low = low;
+range->isLowInclusive = isLowInclusive;
+range->high = high;
+range->isHighInclusive = isHighInclusive;
+return range;
+}
+
+
+celix_version_range_t* celix_versionRange_createInfiniteVersionRange() {
+return
celix_versionRange_createVersionRange(celix_version_createEmptyVersion(), true,
NULL, true);
+}
+
+void celix_versionRange_destroy(celix_version_range_t* range) {
+if (range->high != NULL) {
+celix_version_destroy(range->high);
+}
+if (range->low != NULL) {
+celix_version_destroy(range->low);
+}
+free(range);
+}
+
+
+bool celix_versionRange_isInRange(const celix_version_range_t* versionRange,
const celix_version_t* version) {
+bool inRange = false;
+int high;
+int low;
Review comment:
done
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568600557
##
File path: libs/framework/gtest/src/DependencyManagerTestSuite.cc
##
@@ -63,6 +65,87 @@ TEST_F(DependencyManagerTestSuite, DmCreateComponent) {
ASSERT_TRUE(celix_dependencyManager_allComponentsActive(mng));
}
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemove) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_add(mng, cmp);
+ASSERT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_remove(mng, cmp);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+auto *cmp3 = celix_dmComponent_create(ctx, "test3");
+celix_dependencyManager_add(mng, cmp2);
+celix_dependencyManager_add(mng, cmp3);
+ASSERT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_removeAllComponents(mng);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+}
+
+
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemoveAsync) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp1 = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_addAsync(mng, cmp1);
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+std::atomic count{0};
+auto cb = [](void *data) {
+auto* c = static_cast*>(data);
+c->fetch_add(1);
+};
+
+celix_dependencyManager_removeAsync(mng, cmp1, &count, cb);
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+EXPECT_EQ(1, count.load());
+}
+
+TEST_F(DependencyManagerTestSuite, DmComponentRemoveAllAsync) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp1 = celix_dmComponent_create(ctx, "test1");
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+celix_dependencyManager_add(mng, cmp1);
+celix_dependencyManager_add(mng, cmp2);
+EXPECT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+std::atomic count{0};
+celix_dependencyManager_removeAllComponentsAsync(mng, &count, [](void
*data) {
+auto* c = static_cast*>(data);
+c->fetch_add(1);
+});
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+EXPECT_EQ(1, count.load());
+}
+
+TEST_F(DependencyManagerTestSuite, CDmGetInfo) {
+auto* mng = celix_bundleContext_getDependencyManager(ctx);
+auto* cmp = celix_dmComponent_create(ctx, "test1");
+
+auto* p = celix_properties_create();
+celix_properties_set(p, "key", "value");
+celix_dmComponent_addInterface(cmp, "test-interface", nullptr,
(void*)0x42, p);
Review comment:
done
##
File path: libs/framework/include/requirement.h
##
@@ -31,6 +24,7 @@ typedef struct requirement *requirement_pt;
#include "capability.h"
#include "hash_map.h"
+#include "celix_version_range.h"
#include "version_range.h"
Review comment:
yes
##
File path: libs/utils/include/version_range.h
##
@@ -53,7 +54,7 @@ typedef struct versionRange *version_range_pt;
*/
celix_status_t
versionRange_createVersionRange(version_pt low, bool isLowInclusive,
version_pt high, bool isHighInclusive,
-version_range_pt *versionRange);
+version_range_pt *versionRange) ;
Review comment:
done
##
File path: libs/utils/src/utils.c
##
@@ -61,6 +61,10 @@ bool celix_utils_stringEquals(const char* a, const char* b) {
}
}
+bool celix_utils_isStringNullOrEmpty(const char* s) {
+return s == NULL || strlen(s) == 0;
Review comment:
done
##
File path: libs/framework/gtest/src/DependencyManagerTestSuite.cc
##
@@ -63,6 +65,87 @@ TEST_F(DependencyManagerTestSuite, DmCreateComponent) {
ASSERT_TRUE(celix_dependencyManager_allComponentsActive(mng));
}
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemove) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_add(mng, cmp);
+ASSERT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_remove(mng, cmp);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+auto *cmp3 = celix_dmComponent_create(ctx, "test3");
+celix_dependencyManager_add(mng, cmp2);
+celix_dependencyManager_add(mng, cmp3);
+ASSERT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_removeAllComponents(mng);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+}
+
+
+TEST_F(DependencyManagerTestSu
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568611096
##
File path: libs/framework/src/dm_component_impl.c
##
@@ -416,466 +432,250 @@ celix_status_t
celix_dmComponent_removeInterface(celix_dm_component_t *component
celix_status_t status = CELIX_ILLEGAL_ARGUMENT;
celixThreadMutex_lock(&component->mutex);
-int nof_interfaces = arrayList_size(component->dm_interfaces);
-for (unsigned int i = 0; i < nof_interfaces; ++i) {
-dm_interface_t *interface = (dm_interface_t *)
arrayList_get(component->dm_interfaces, i);
+int nof_interfaces = celix_arrayList_size(component->providedInterfaces);
+dm_interface_t* removedInterface = NULL;
+for (int i = 0; i < nof_interfaces; ++i) {
+dm_interface_t *interface =
celix_arrayList_get(component->providedInterfaces, i);
if (interface->service == service) {
-arrayList_remove(component->dm_interfaces, i);
-if (component->state == DM_CMP_STATE_TRACKING_OPTIONAL) {
-celixThreadMutex_unlock(&component->mutex);
-component_unregisterServices(component);
-component_registerServices(component);
-celixThreadMutex_lock(&component->mutex);
-}
-status = CELIX_SUCCESS;
+celix_arrayList_removeAt(component->providedInterfaces, i);
+removedInterface = interface;
break;
}
}
celixThreadMutex_unlock(&component->mutex);
+if (removedInterface != NULL) {
+celix_bundleContext_unregisterService(component->context,
removedInterface->svcId);
+free(removedInterface->serviceName);
+free(removedInterface);
+}
+
return status;
}
-celix_status_t component_getInterfaces(celix_dm_component_t *component,
array_list_pt *out) {
+celix_status_t component_getInterfaces(celix_dm_component_t *component,
celix_array_list_t **out) {
return celix_dmComponent_getInterfaces(component, out);
}
-celix_status_t celix_dmComponent_getInterfaces(celix_dm_component_t
*component, array_list_pt *out) {
-celix_status_t status = CELIX_SUCCESS;
-array_list_pt names = NULL;
-arrayList_create(&names);
+celix_status_t celix_dmComponent_getInterfaces(celix_dm_component_t
*component, celix_array_list_t **out) {
+celix_array_list_t* names = celix_arrayList_create();
+
celixThreadMutex_lock(&component->mutex);
-int size = arrayList_size(component->dm_interfaces);
-int i;
-for (i = 0; i < size; i += 1) {
-dm_interface_info_pt info = calloc(1, sizeof(*info));
-dm_interface_t *interface = arrayList_get(component->dm_interfaces, i);
-info->name = strdup(interface->serviceName);
-properties_copy(interface->properties, &info->properties);
-arrayList_add(names, info);
+int size = celix_arrayList_size(component->providedInterfaces);
+for (int i = 0; i < size; i += 1) {
+dm_interface_info_t* info = calloc(1, sizeof(*info));
+dm_interface_t *interface =
celix_arrayList_get(component->providedInterfaces, i);
+info->name = celix_utils_strdup(interface->serviceName);
+info->properties = celix_properties_copy(interface->properties);
+celix_arrayList_add(names, info);
}
celixThreadMutex_unlock(&component->mutex);
+*out = names;
-if (status == CELIX_SUCCESS) {
-*out = names;
-}
-
-return status;
-}
-
-celix_status_t celix_private_dmComponent_handleEvent(celix_dm_component_t
*component, celix_dm_service_dependency_t *dependency, dm_event_pt event) {
- celix_status_t status = CELIX_SUCCESS;
-
- dm_handle_event_type_pt data = calloc(1, sizeof(*data));
- data->dependency = dependency;
- data->event = event;
- data->newEvent = NULL;
-
- status = executor_executeTask(component->executor, component,
component_handleEventTask, data);
-// component_handleEventTask(component, data);
-
- return status;
+return CELIX_SUCCESS;
}
-static celix_status_t component_handleEventTask(celix_dm_component_t
*component, dm_handle_event_type_pt data) {
- celix_status_t status = CELIX_SUCCESS;
-
- switch (data->event->event_type) {
- case DM_EVENT_ADDED:
- component_handleAdded(component,data->dependency,
data->event);
- break;
- case DM_EVENT_CHANGED:
- component_handleChanged(component,data->dependency,
data->event);
- break;
- case DM_EVENT_REMOVED:
- component_handleRemoved(component,data->dependency,
data->event);
- break;
- case DM_EVENT_SWAPPED:
- component_handleSwapped(component,data->dependency,
data->event, data->newEvent);
- break;
- default
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568610023
##
File path: libs/framework/src/dm_component_impl.c
##
@@ -889,402 +689,158 @@ static celix_status_t
component_calculateNewState(celix_dm_component_t *componen
return status;
}
-static celix_status_t component_performTransition(celix_dm_component_t
*component, celix_dm_component_state_t oldState, celix_dm_component_state_t
newState, bool *transition) {
-celix_status_t status = CELIX_SUCCESS;
-//printf("performing transition for %s in thread %i from %i to %i\n",
component->name, (int) pthread_self(), oldState, newState);
-
+/**
+ * perform state transition. This function should be called with the
component->mutex locked.
+ */
+static celix_status_t celix_dmComponent_performTransition(celix_dm_component_t
*component, celix_dm_component_state_t oldState, celix_dm_component_state_t
newState, bool *transition) {
if (oldState == newState) {
*transition = false;
-} else if (oldState == DM_CMP_STATE_INACTIVE && newState ==
DM_CMP_STATE_WAITING_FOR_REQUIRED) {
-component_startDependencies(component, component->dependencies);
+return CELIX_SUCCESS;
+}
+
+celix_bundleContext_log(component->context,
+ CELIX_LOG_LEVEL_TRACE,
+ "performing transition for component '%s' (uuid=%s) from state %s
to state %s",
+ component->name,
+ component->uuid,
+ celix_dmComponent_stateToString(oldState),
+ celix_dmComponent_stateToString(newState));
+
+celix_status_t status = CELIX_SUCCESS;
+if (oldState == DM_CMP_STATE_INACTIVE && newState ==
DM_CMP_STATE_WAITING_FOR_REQUIRED) {
+celix_dmComponent_enableDependencies(component);
*transition = true;
} else if (oldState == DM_CMP_STATE_WAITING_FOR_REQUIRED && newState ==
DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED) {
-component_invokeAddRequiredDependencies(component);
-component_invokeAutoConfigDependencies(component);
if (component->callbackInit) {
status = component->callbackInit(component->implementation);
}
*transition = true;
} else if (oldState == DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED
&& newState == DM_CMP_STATE_TRACKING_OPTIONAL) {
-component_invokeAddRequiredInstanceBoundDependencies(component);
-component_invokeAutoConfigInstanceBoundDependencies(component);
- component_invokeAddOptionalDependencies(component);
if (component->callbackStart) {
status = component->callbackStart(component->implementation);
}
-component_registerServices(component);
+celix_dmComponent_registerServices(component, false);
+component->nrOfTimesStarted += 1;
*transition = true;
} else if (oldState == DM_CMP_STATE_TRACKING_OPTIONAL && newState ==
DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED) {
-component_unregisterServices(component);
+celix_dmComponent_unregisterServices(component, false);
if (component->callbackStop) {
status = component->callbackStop(component->implementation);
}
- component_invokeRemoveOptionalDependencies(component);
-component_invokeRemoveInstanceBoundDependencies(component);
*transition = true;
} else if (oldState == DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED
&& newState == DM_CMP_STATE_WAITING_FOR_REQUIRED) {
- if (component->callbackDeinit) {
- status = component->callbackDeinit(component->implementation);
- }
-component_invokeRemoveRequiredDependencies(component);
+if (component->callbackDeinit) {
+status = component->callbackDeinit(component->implementation);
+}
*transition = true;
} else if (oldState == DM_CMP_STATE_WAITING_FOR_REQUIRED && newState ==
DM_CMP_STATE_INACTIVE) {
-component_stopDependencies(component);
+celix_dmComponent_disableDependencies(component);
*transition = true;
}
return status;
}
-static celix_status_t component_allRequiredAvailable(celix_dm_component_t
*component, bool *available) {
-celix_status_t status = CELIX_SUCCESS;
-
-pthread_mutex_lock(&component->mutex);
-*available = true;
-for (unsigned int i = 0; i < arrayList_size(component->dependencies); i++)
{
-celix_dm_service_dependency_t *dependency =
arrayList_get(component->dependencies, i);
-bool required = false;
-bool instanceBound = false;
-
-serviceDependency_isRequired(dependency, &required);
-serviceDependency_isInstanceBound(dependency, &instanceBound);
-
-if (required && !instanceBound) {
-bool isAvailable = false;
-serviceDependency_isAvailable(dependency, &isAvailable);
-if (!isAvailable) {
-
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568608432
##
File path: libs/framework/src/dm_component_impl.c
##
@@ -889,402 +689,158 @@ static celix_status_t
component_calculateNewState(celix_dm_component_t *componen
return status;
}
-static celix_status_t component_performTransition(celix_dm_component_t
*component, celix_dm_component_state_t oldState, celix_dm_component_state_t
newState, bool *transition) {
-celix_status_t status = CELIX_SUCCESS;
-//printf("performing transition for %s in thread %i from %i to %i\n",
component->name, (int) pthread_self(), oldState, newState);
-
+/**
+ * perform state transition. This function should be called with the
component->mutex locked.
+ */
+static celix_status_t celix_dmComponent_performTransition(celix_dm_component_t
*component, celix_dm_component_state_t oldState, celix_dm_component_state_t
newState, bool *transition) {
if (oldState == newState) {
*transition = false;
-} else if (oldState == DM_CMP_STATE_INACTIVE && newState ==
DM_CMP_STATE_WAITING_FOR_REQUIRED) {
-component_startDependencies(component, component->dependencies);
+return CELIX_SUCCESS;
+}
+
+celix_bundleContext_log(component->context,
+ CELIX_LOG_LEVEL_TRACE,
+ "performing transition for component '%s' (uuid=%s) from state %s
to state %s",
+ component->name,
+ component->uuid,
+ celix_dmComponent_stateToString(oldState),
+ celix_dmComponent_stateToString(newState));
+
+celix_status_t status = CELIX_SUCCESS;
+if (oldState == DM_CMP_STATE_INACTIVE && newState ==
DM_CMP_STATE_WAITING_FOR_REQUIRED) {
+celix_dmComponent_enableDependencies(component);
*transition = true;
} else if (oldState == DM_CMP_STATE_WAITING_FOR_REQUIRED && newState ==
DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED) {
-component_invokeAddRequiredDependencies(component);
-component_invokeAutoConfigDependencies(component);
if (component->callbackInit) {
status = component->callbackInit(component->implementation);
}
*transition = true;
} else if (oldState == DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED
&& newState == DM_CMP_STATE_TRACKING_OPTIONAL) {
-component_invokeAddRequiredInstanceBoundDependencies(component);
-component_invokeAutoConfigInstanceBoundDependencies(component);
- component_invokeAddOptionalDependencies(component);
if (component->callbackStart) {
status = component->callbackStart(component->implementation);
}
-component_registerServices(component);
+celix_dmComponent_registerServices(component, false);
+component->nrOfTimesStarted += 1;
*transition = true;
} else if (oldState == DM_CMP_STATE_TRACKING_OPTIONAL && newState ==
DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED) {
-component_unregisterServices(component);
+celix_dmComponent_unregisterServices(component, false);
if (component->callbackStop) {
status = component->callbackStop(component->implementation);
}
- component_invokeRemoveOptionalDependencies(component);
-component_invokeRemoveInstanceBoundDependencies(component);
*transition = true;
} else if (oldState == DM_CMP_STATE_INSTANTIATED_AND_WAITING_FOR_REQUIRED
&& newState == DM_CMP_STATE_WAITING_FOR_REQUIRED) {
- if (component->callbackDeinit) {
- status = component->callbackDeinit(component->implementation);
- }
-component_invokeRemoveRequiredDependencies(component);
+if (component->callbackDeinit) {
+status = component->callbackDeinit(component->implementation);
+}
*transition = true;
} else if (oldState == DM_CMP_STATE_WAITING_FOR_REQUIRED && newState ==
DM_CMP_STATE_INACTIVE) {
-component_stopDependencies(component);
+celix_dmComponent_disableDependencies(component);
*transition = true;
}
return status;
}
-static celix_status_t component_allRequiredAvailable(celix_dm_component_t
*component, bool *available) {
-celix_status_t status = CELIX_SUCCESS;
-
-pthread_mutex_lock(&component->mutex);
-*available = true;
-for (unsigned int i = 0; i < arrayList_size(component->dependencies); i++)
{
-celix_dm_service_dependency_t *dependency =
arrayList_get(component->dependencies, i);
-bool required = false;
-bool instanceBound = false;
-
-serviceDependency_isRequired(dependency, &required);
-serviceDependency_isInstanceBound(dependency, &instanceBound);
-
-if (required && !instanceBound) {
-bool isAvailable = false;
-serviceDependency_isAvailable(dependency, &isAvailable);
-if (!isAvailable) {
-
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568607313
##
File path: libs/framework/src/dm_component_impl.c
##
@@ -282,78 +304,72 @@ celix_status_t
component_removeServiceDependency(celix_dm_component_t *component
return celix_dmComponent_removeServiceDependency(component, dependency);
}
-celix_status_t celix_dmComponent_removeServiceDependency(celix_dm_component_t
*component, celix_dm_service_dependency_t *dependency) {
-celix_status_t status = CELIX_SUCCESS;
-
-executor_executeTask(component->executor, component, component_removeTask,
dependency);
-
-return status;
-}
-
-static celix_status_t component_removeTask(celix_dm_component_t *component,
celix_dm_service_dependency_t *dependency) {
-celix_status_t status = CELIX_SUCCESS;
-
-pthread_mutex_lock(&component->mutex);
-arrayList_removeElement(component->dependencies, dependency);
-pthread_mutex_unlock(&component->mutex);
-
-if (component->state != DM_CMP_STATE_INACTIVE) {
-serviceDependency_stop(dependency);
+celix_status_t celix_private_dmComponent_enable(celix_dm_component_t
*component) {
+celixThreadMutex_lock(&component->mutex);
+if (!component->isEnabled) {
+component->isEnabled = true;
}
+celixThreadMutex_unlock(&component->mutex);
+celix_dmComponent_handleChange(component);
Review comment:
not really needed, handle change will do (effectually) nothing. But it
does generate unneeded events. So I updated this.
##
File path: libs/framework/src/dm_component_impl.c
##
@@ -282,78 +304,72 @@ celix_status_t
component_removeServiceDependency(celix_dm_component_t *component
return celix_dmComponent_removeServiceDependency(component, dependency);
}
-celix_status_t celix_dmComponent_removeServiceDependency(celix_dm_component_t
*component, celix_dm_service_dependency_t *dependency) {
-celix_status_t status = CELIX_SUCCESS;
-
-executor_executeTask(component->executor, component, component_removeTask,
dependency);
-
-return status;
-}
-
-static celix_status_t component_removeTask(celix_dm_component_t *component,
celix_dm_service_dependency_t *dependency) {
-celix_status_t status = CELIX_SUCCESS;
-
-pthread_mutex_lock(&component->mutex);
-arrayList_removeElement(component->dependencies, dependency);
-pthread_mutex_unlock(&component->mutex);
-
-if (component->state != DM_CMP_STATE_INACTIVE) {
-serviceDependency_stop(dependency);
+celix_status_t celix_private_dmComponent_enable(celix_dm_component_t
*component) {
+celixThreadMutex_lock(&component->mutex);
+if (!component->isEnabled) {
+component->isEnabled = true;
}
+celixThreadMutex_unlock(&component->mutex);
+celix_dmComponent_handleChange(component);
+return CELIX_SUCCESS;
+}
-pthread_mutex_lock(&component->mutex);
-array_list_pt events = hashMap_remove(component->dependencyEvents,
dependency);
-pthread_mutex_unlock(&component->mutex);
-
- serviceDependency_destroy(&dependency);
-
-while (!arrayList_isEmpty(events)) {
- dm_event_pt event = arrayList_remove(events, 0);
- event_destroy(&event);
+static celix_status_t celix_dmComponent_disable(celix_dm_component_t
*component) {
+celixThreadMutex_lock(&component->mutex);
+if (component->isEnabled) {
+component->isEnabled = false;
}
-arrayList_destroy(events);
-
-component_handleChange(component);
-
-return status;
+celixThreadMutex_unlock(&component->mutex);
+celix_dmComponent_handleChange(component);
Review comment:
same
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568604663
##
File path: libs/framework/include/celix/dm/ServiceDependency.h
##
@@ -78,14 +70,29 @@ namespace celix { namespace dm {
/**
* Whether the service dependency is valid.
+ *
+ * Depcrated -> will always return true.
Review comment:
done
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568604388
##
File path: libs/framework/gtest/src/DependencyManagerTestSuite.cc
##
@@ -63,6 +65,87 @@ TEST_F(DependencyManagerTestSuite, DmCreateComponent) {
ASSERT_TRUE(celix_dependencyManager_allComponentsActive(mng));
}
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemove) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_add(mng, cmp);
+ASSERT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_remove(mng, cmp);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+auto *cmp3 = celix_dmComponent_create(ctx, "test3");
+celix_dependencyManager_add(mng, cmp2);
+celix_dependencyManager_add(mng, cmp3);
+ASSERT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_removeAllComponents(mng);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+}
+
+
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemoveAsync) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp1 = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_addAsync(mng, cmp1);
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+std::atomic count{0};
+auto cb = [](void *data) {
+auto* c = static_cast*>(data);
+c->fetch_add(1);
+};
+
+celix_dependencyManager_removeAsync(mng, cmp1, &count, cb);
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+EXPECT_EQ(1, count.load());
+}
+
+TEST_F(DependencyManagerTestSuite, DmComponentRemoveAllAsync) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp1 = celix_dmComponent_create(ctx, "test1");
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+celix_dependencyManager_add(mng, cmp1);
+celix_dependencyManager_add(mng, cmp2);
+EXPECT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+std::atomic count{0};
+celix_dependencyManager_removeAllComponentsAsync(mng, &count, [](void
*data) {
+auto* c = static_cast*>(data);
+c->fetch_add(1);
+});
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+EXPECT_EQ(1, count.load());
+}
+
+TEST_F(DependencyManagerTestSuite, CDmGetInfo) {
+auto* mng = celix_bundleContext_getDependencyManager(ctx);
+auto* cmp = celix_dmComponent_create(ctx, "test1");
+
+auto* p = celix_properties_create();
+celix_properties_set(p, "key", "value");
+celix_dmComponent_addInterface(cmp, "test-interface", nullptr,
(void*)0x42, p);
+
+auto* dep = celix_dmServiceDependency_create();
+celix_dmServiceDependency_setService(dep, "test-interface", nullptr,
nullptr);
+celix_dmComponent_addServiceDependency(cmp, dep);
+
+celix_dependencyManager_add(mng, cmp);
+
+auto* infos = celix_dependencyManager_createInfos(mng);
+ASSERT_EQ(1, celix_arrayList_size(infos));
+auto* dmInfo =
(celix_dependency_manager_info_t*)celix_arrayList_get(infos, 0);
+ASSERT_EQ(1, celix_arrayList_size(dmInfo->components));
+auto *info =
(celix_dm_component_info_t*)celix_arrayList_get(dmInfo->components, 0);
+EXPECT_EQ(1, celix_arrayList_size(info->interfaces));
Review comment:
done
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568602078
##
File path: libs/utils/src/utils.c
##
@@ -61,6 +61,10 @@ bool celix_utils_stringEquals(const char* a, const char* b) {
}
}
+bool celix_utils_isStringNullOrEmpty(const char* s) {
+return s == NULL || strlen(s) == 0;
Review comment:
done
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313: URL: https://github.com/apache/celix/pull/313#discussion_r568601685 ## File path: libs/utils/include/version_range.h ## @@ -53,7 +54,7 @@ typedef struct versionRange *version_range_pt; */ celix_status_t versionRange_createVersionRange(version_pt low, bool isLowInclusive, version_pt high, bool isHighInclusive, -version_range_pt *versionRange); +version_range_pt *versionRange) ; Review comment: done This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313: URL: https://github.com/apache/celix/pull/313#discussion_r568601296 ## File path: libs/framework/include/requirement.h ## @@ -31,6 +24,7 @@ typedef struct requirement *requirement_pt; #include "capability.h" #include "hash_map.h" +#include "celix_version_range.h" #include "version_range.h" Review comment: yes This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: [email protected]
[GitHub] [celix] pnoltes commented on a change in pull request #313: Feature/refactor c dep man service trackers
pnoltes commented on a change in pull request #313:
URL: https://github.com/apache/celix/pull/313#discussion_r568600557
##
File path: libs/framework/gtest/src/DependencyManagerTestSuite.cc
##
@@ -63,6 +65,87 @@ TEST_F(DependencyManagerTestSuite, DmCreateComponent) {
ASSERT_TRUE(celix_dependencyManager_allComponentsActive(mng));
}
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemove) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_add(mng, cmp);
+ASSERT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_remove(mng, cmp);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+auto *cmp3 = celix_dmComponent_create(ctx, "test3");
+celix_dependencyManager_add(mng, cmp2);
+celix_dependencyManager_add(mng, cmp3);
+ASSERT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+celix_dependencyManager_removeAllComponents(mng);
+ASSERT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+}
+
+
+TEST_F(DependencyManagerTestSuite, DmComponentAddRemoveAsync) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp1 = celix_dmComponent_create(ctx, "test1");
+celix_dependencyManager_addAsync(mng, cmp1);
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(1, celix_dependencyManager_nrOfComponents(mng));
+
+std::atomic count{0};
+auto cb = [](void *data) {
+auto* c = static_cast*>(data);
+c->fetch_add(1);
+};
+
+celix_dependencyManager_removeAsync(mng, cmp1, &count, cb);
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+EXPECT_EQ(1, count.load());
+}
+
+TEST_F(DependencyManagerTestSuite, DmComponentRemoveAllAsync) {
+auto *mng = celix_bundleContext_getDependencyManager(ctx);
+auto *cmp1 = celix_dmComponent_create(ctx, "test1");
+auto *cmp2 = celix_dmComponent_create(ctx, "test2");
+celix_dependencyManager_add(mng, cmp1);
+celix_dependencyManager_add(mng, cmp2);
+EXPECT_EQ(2, celix_dependencyManager_nrOfComponents(mng));
+
+std::atomic count{0};
+celix_dependencyManager_removeAllComponentsAsync(mng, &count, [](void
*data) {
+auto* c = static_cast*>(data);
+c->fetch_add(1);
+});
+celix_dependencyManager_wait(mng);
+EXPECT_EQ(0, celix_dependencyManager_nrOfComponents(mng));
+EXPECT_EQ(1, count.load());
+}
+
+TEST_F(DependencyManagerTestSuite, CDmGetInfo) {
+auto* mng = celix_bundleContext_getDependencyManager(ctx);
+auto* cmp = celix_dmComponent_create(ctx, "test1");
+
+auto* p = celix_properties_create();
+celix_properties_set(p, "key", "value");
+celix_dmComponent_addInterface(cmp, "test-interface", nullptr,
(void*)0x42, p);
Review comment:
done
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
