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 2018/05/21 19:02:32 UTC
celix git commit: CELIX-426: Fixes a segfault and some compiler
issues for ubuntu LTS
Repository: celix
Updated Branches:
refs/heads/feature/CELIX-426-cxx-api ad2ee8ed0 -> e7cfed4cb
CELIX-426: Fixes a segfault and some compiler issues for ubuntu LTS
Project: http://git-wip-us.apache.org/repos/asf/celix/repo
Commit: http://git-wip-us.apache.org/repos/asf/celix/commit/e7cfed4c
Tree: http://git-wip-us.apache.org/repos/asf/celix/tree/e7cfed4c
Diff: http://git-wip-us.apache.org/repos/asf/celix/diff/e7cfed4c
Branch: refs/heads/feature/CELIX-426-cxx-api
Commit: e7cfed4cb30b67d5649dffe53511c8f8bfaf2225
Parents: ad2ee8e
Author: Pepijn Noltes <pe...@gmail.com>
Authored: Mon May 21 21:02:11 2018 +0200
Committer: Pepijn Noltes <pe...@gmail.com>
Committed: Mon May 21 21:02:11 2018 +0200
----------------------------------------------------------------------
.../include/celix/impl/BundleContextImpl.h | 113 +++++++++++++++++--
1 file changed, 104 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/celix/blob/e7cfed4c/framework/include/celix/impl/BundleContextImpl.h
----------------------------------------------------------------------
diff --git a/framework/include/celix/impl/BundleContextImpl.h b/framework/include/celix/impl/BundleContextImpl.h
index 4600d03..982963a 100644
--- a/framework/include/celix/impl/BundleContextImpl.h
+++ b/framework/include/celix/impl/BundleContextImpl.h
@@ -60,13 +60,19 @@ namespace {
namespace celix {
struct ServiceRegistrationEntry {
- long svcId{-1};
- celix_service_factory_t factory{};
- celix_service_registration_options_t cOpts{};
+ ServiceRegistrationEntry() {
+ std::memset(&this->cOpts, 0, sizeof(this->cOpts));
+ std::memset(&this->factory, 0, sizeof(this->factory));
+ }
+ celix_service_factory_t factory;
+ celix_service_registration_options_t cOpts;
};
struct ServiceTrackingEntry {
- celix_service_tracking_options_t cOpts{};
+ ServiceTrackingEntry() {
+ std::memset(&this->cOpts, 0, sizeof(this->cOpts));
+ }
+ celix_service_tracking_options_t cOpts;
std::unique_ptr<ServiceTrackingEntryFunctions> functions{nullptr};
};
@@ -106,7 +112,12 @@ namespace celix {
BundleContextImpl& operator=(BundleContextImpl&&) = delete;
void unregisterService(long serviceId) noexcept override {
+ std::lock_guard<std::mutex> lock{this->mutex};
celix_bundleContext_unregisterService(this->c_ctx, serviceId);
+ auto it = this->registrationEntries.find(serviceId);
+ if (it != this->registrationEntries.end()) {
+ this->registrationEntries.erase(it);
+ }
}
std::vector<long> findServices(const std::string &/*serviceName*/, const std::string &/*versionRange*/, const std::string &/*filter*/, const std::string &/*lang = ""*/) noexcept override {
@@ -377,10 +388,11 @@ long celix::BundleContext::trackServicesWithOptions(const celix::ServiceTracking
auto set = opts.set;
if (set) {
- auto voidSet = [set](void *voidSvc) {
+ auto voidfunc = [set](void *voidSvc) {
I *typedSvc = static_cast<I*>(voidSvc);
set(typedSvc);
};
+ entry.functions->set = voidfunc;
entry.cOpts.set = [](void *handle, void *svc) {
auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
(fentry->set)(svc);
@@ -389,10 +401,11 @@ long celix::BundleContext::trackServicesWithOptions(const celix::ServiceTracking
auto setWithProperties = opts.setWithProperties;
if (setWithProperties) {
- auto voidSet = [setWithProperties](void *voidSvc, const celix::Properties &props) {
+ auto voidfunc = [setWithProperties](void *voidSvc, const celix::Properties &props) {
I *typedSvc = static_cast<I*>(voidSvc);
setWithProperties(typedSvc, props);
};
+ entry.functions->setWithProperties = voidfunc;
entry.cOpts.setWithProperties = [](void *handle, void *svc, const celix_properties_t *c_props) {
auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
celix::Properties props = createFromCProps(c_props);
@@ -402,10 +415,11 @@ long celix::BundleContext::trackServicesWithOptions(const celix::ServiceTracking
auto setWithOwner = opts.setWithOwner;
if (setWithOwner) {
- auto voidSet = [setWithOwner](void *voidSvc, const celix::Properties &props, const celix::Bundle &bnd) {
+ auto voidfunc = [setWithOwner](void *voidSvc, const celix::Properties &props, const celix::Bundle &bnd) {
I *typedSvc = static_cast<I*>(voidSvc);
setWithOwner(typedSvc, props, bnd);
};
+ entry.functions->setWithOwner = voidfunc;
entry.cOpts.setWithOwner = [](void *handle, void *svc, const celix_properties_t *c_props, const celix_bundle_t *c_bnd) {
auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
celix::Properties props = createFromCProps(c_props);
@@ -415,10 +429,91 @@ long celix::BundleContext::trackServicesWithOptions(const celix::ServiceTracking
};
}
+ auto add = opts.add;
+ if (add) {
+ auto voidfunc = [add](void *voidSvc) {
+ I *typedSvc = static_cast<I*>(voidSvc);
+ add(typedSvc);
+ };
+ entry.functions->add = voidfunc;
+ entry.cOpts.add = [](void *handle, void *svc) {
+ auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
+ (fentry->add)(svc);
+ };
+ }
- //TODO add
- //TODO remove
+ auto addWithProperties = opts.addWithProperties;
+ if (addWithProperties) {
+ auto voidfunc = [addWithProperties](void *voidSvc, const celix::Properties &props) {
+ I *typedSvc = static_cast<I*>(voidSvc);
+ addWithProperties(typedSvc, props);
+ };
+ entry.functions->addWithProperties = voidfunc;
+ entry.cOpts.addWithProperties = [](void *handle, void *svc, const celix_properties_t *c_props) {
+ auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
+ celix::Properties props = createFromCProps(c_props);
+ (fentry->addWithProperties)(svc, props);
+ };
+ }
+ auto addWithOwner = opts.setWithOwner;
+ if (addWithOwner) {
+ auto voidfunc = [addWithOwner](void *voidSvc, const celix::Properties &props, const celix::Bundle &bnd) {
+ I *typedSvc = static_cast<I*>(voidSvc);
+ addWithOwner(typedSvc, props, bnd);
+ };
+ entry.functions->addWithOwner = voidfunc;
+ entry.cOpts.addWithOwner = [](void *handle, void *svc, const celix_properties_t *c_props, const celix_bundle_t *c_bnd) {
+ auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
+ celix::Properties props = createFromCProps(c_props);
+ auto m_bnd = const_cast<celix_bundle_t *>(c_bnd);
+ celix::impl::BundleImpl bnd{m_bnd};
+ (fentry->addWithOwner)(svc, props, bnd);
+ };
+ }
+
+ auto remove = opts.remove;
+ if (remove) {
+ auto voidfunc = [remove](void *voidSvc) {
+ I *typedSvc = static_cast<I*>(voidSvc);
+ remove(typedSvc);
+ };
+ entry.functions->remove = voidfunc;
+ entry.cOpts.remove = [](void *handle, void *svc) {
+ auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
+ (fentry->add)(svc);
+ };
+ }
+
+ auto removeWithProperties = opts.removeWithProperties;
+ if (removeWithProperties) {
+ auto voidfunc = [removeWithProperties](void *voidSvc, const celix::Properties &props) {
+ I *typedSvc = static_cast<I*>(voidSvc);
+ removeWithProperties(typedSvc, props);
+ };
+ entry.functions->removeWithProperties = voidfunc;
+ entry.cOpts.removeWithProperties = [](void *handle, void *svc, const celix_properties_t *c_props) {
+ auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
+ celix::Properties props = createFromCProps(c_props);
+ (fentry->removeWithProperties)(svc, props);
+ };
+ }
+
+ auto removeWithOwner = opts.removeWithOwner;
+ if (removeWithOwner) {
+ auto voidfunc = [removeWithOwner](void *voidSvc, const celix::Properties &props, const celix::Bundle &bnd) {
+ I *typedSvc = static_cast<I*>(voidSvc);
+ removeWithOwner(typedSvc, props, bnd);
+ };
+ entry.functions->removeWithOwner = voidfunc;
+ entry.cOpts.removeWithOwner = [](void *handle, void *svc, const celix_properties_t *c_props, const celix_bundle_t *c_bnd) {
+ auto *fentry = static_cast<ServiceTrackingEntryFunctions*>(handle);
+ celix::Properties props = createFromCProps(c_props);
+ auto m_bnd = const_cast<celix_bundle_t *>(c_bnd);
+ celix::impl::BundleImpl bnd{m_bnd};
+ (fentry->removeWithOwner)(svc, props, bnd);
+ };
+ }
entry.cOpts.filter.serviceName = opts.filter.serviceName.c_str();
entry.cOpts.filter.serviceLanguage = opts.filter.serviceLanguage.c_str();