in libs/framework/src/framework.c [1206:1273]
static void fw_handleEventRequest(celix_framework_t *framework, celix_framework_event_t* event) {
if (event->type == CELIX_BUNDLE_EVENT_TYPE) {
celix_array_list_t *localListeners = celix_arrayList_create();
celixThreadMutex_lock(&framework->bundleListenerLock);
for (int i = 0; i < celix_arrayList_size(framework->bundleListeners); ++i) {
fw_bundle_listener_pt listener = celix_arrayList_get(framework->bundleListeners, i);
fw_bundleListener_increaseUseCount(listener);
celix_arrayList_add(localListeners, listener);
}
celixThreadMutex_unlock(&framework->bundleListenerLock);
for (int i = 0; i < celix_arrayList_size(localListeners); ++i) {
fw_bundle_listener_pt listener = celix_arrayList_get(localListeners, i);
bundle_event_t bEvent;
memset(&bEvent, 0, sizeof(bEvent));
bEvent.bnd = event->bndEntry->bnd;
bEvent.type = event->bundleEvent;
fw_invokeBundleListener(framework, listener->listener, &bEvent, listener->bundle);
fw_bundleListener_decreaseUseCount(listener);
}
celix_arrayList_destroy(localListeners);
__atomic_sub_fetch(&framework->dispatcher.stats.nbBundle, 1, __ATOMIC_RELAXED);
} else if (event->type == CELIX_FRAMEWORK_EVENT_TYPE) {
celixThreadMutex_lock(&framework->frameworkListenersLock);
for (int i = 0; i < celix_arrayList_size(framework->frameworkListeners); ++i) {
fw_framework_listener_pt listener = celix_arrayList_get(framework->frameworkListeners, i);
framework_event_t fEvent;
memset(&fEvent, 0, sizeof(fEvent));
fEvent.type = event->fwEvent;
fEvent.error = event->error;
fEvent.errorCode = event->errorCode;
fw_invokeFrameworkListener(framework, listener->listener, &fEvent, listener->bundle);
}
celixThreadMutex_unlock(&framework->frameworkListenersLock);
__atomic_sub_fetch(&framework->dispatcher.stats.nbFramework, 1, __ATOMIC_RELAXED);
} else if (event->type == CELIX_REGISTER_SERVICE_EVENT) {
service_registration_t* reg = NULL;
celix_status_t status = CELIX_SUCCESS;
if (event->cancelled) {
fw_log(framework->logger, CELIX_LOG_LEVEL_DEBUG, "CELIX_REGISTER_SERVICE_EVENT for svcId %li (service name = %s) was cancelled. Skipping registration", event->registerServiceId, event->serviceName);
celix_properties_destroy(event->properties);
} else if (event->factory != NULL) {
status = celix_serviceRegistry_registerServiceFactory(framework->registry, event->bndEntry->bnd, event->serviceName, event->factory, event->properties, event->registerServiceId, ®);
} else {
status = celix_serviceRegistry_registerService(framework->registry, event->bndEntry->bnd, event->serviceName, event->svc, event->properties, event->registerServiceId, ®);
}
if (status != CELIX_SUCCESS) {
fw_log(framework->logger, CELIX_LOG_LEVEL_ERROR, "Could not register service async. svc name is %s, error is %s", event->serviceName, celix_strerror(status));
} else if (!event->cancelled && event->registerCallback != NULL) {
event->registerCallback(event->registerData, serviceRegistration_getServiceId(reg));
}
__atomic_sub_fetch(&framework->dispatcher.stats.nbRegister, 1, __ATOMIC_RELAXED);
} else if (event->type == CELIX_UNREGISTER_SERVICE_EVENT) {
celix_serviceRegistry_unregisterService(framework->registry, event->bndEntry->bnd, event->unregisterServiceId);
__atomic_sub_fetch(&framework->dispatcher.stats.nbUnregister, 1, __ATOMIC_RELAXED);
} else if (event->type == CELIX_GENERIC_EVENT) {
if (event->genericProcess != NULL) {
event->genericProcess(event->genericProcessData);
}
__atomic_sub_fetch(&framework->dispatcher.stats.nbEvent, 1, __ATOMIC_RELAXED);
}
if (event->doneCallback != NULL && !event->cancelled) {
event->doneCallback(event->doneData);
}
}