From 0b1c5a49df72fa684c89a2109d5ffa88f96bcdea Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nicolas.pope@utu.fi> Date: Thu, 6 Jun 2019 18:36:10 +0300 Subject: [PATCH] Fixes #60 with unbinds --- components/common/cpp/include/ftl/configuration.hpp | 1 - components/control/cpp/include/ftl/slave.hpp | 3 +++ components/control/cpp/src/master.cpp | 2 +- components/control/cpp/src/slave.cpp | 7 +++++-- components/net/cpp/include/ftl/net/dispatcher.hpp | 7 +++++++ components/net/cpp/include/ftl/net/universe.hpp | 5 ++++- components/net/cpp/src/dispatcher.cpp | 2 +- components/net/cpp/src/universe.cpp | 5 +++++ components/rgbd-sources/src/net_source.cpp | 7 ++++++- components/rgbd-sources/src/rgbd_streamer.cpp | 7 ++++++- 10 files changed, 38 insertions(+), 8 deletions(-) diff --git a/components/common/cpp/include/ftl/configuration.hpp b/components/common/cpp/include/ftl/configuration.hpp index 531852ca5..046b58a07 100644 --- a/components/common/cpp/include/ftl/configuration.hpp +++ b/components/common/cpp/include/ftl/configuration.hpp @@ -119,7 +119,6 @@ T *ftl::config::create(ftl::Configurable *parent, const std::string &name, ARGS if (entity.is_object()) { if (!entity["$id"].is_string()) { - // TODO(Nick) Check for # in URI std::string id_str = *parent->get<std::string>("$id"); if (id_str.find('#') != std::string::npos) { entity["$id"] = id_str + std::string("/") + name; diff --git a/components/control/cpp/include/ftl/slave.hpp b/components/control/cpp/include/ftl/slave.hpp index e61290d63..08e973339 100644 --- a/components/control/cpp/include/ftl/slave.hpp +++ b/components/control/cpp/include/ftl/slave.hpp @@ -11,6 +11,9 @@ class Slave { public: Slave(ftl::net::Universe *, ftl::Configurable *); ~Slave(); + + private: + ftl::net::Universe *net_; }; } diff --git a/components/control/cpp/src/master.cpp b/components/control/cpp/src/master.cpp index 004d2f7cf..33ea746b7 100644 --- a/components/control/cpp/src/master.cpp +++ b/components/control/cpp/src/master.cpp @@ -19,7 +19,7 @@ Master::Master(Configurable *root, Universe *net) } Master::~Master() { - + net_->unbind("log"); } void Master::restart() { diff --git a/components/control/cpp/src/slave.cpp b/components/control/cpp/src/slave.cpp index 8485c825e..076584230 100644 --- a/components/control/cpp/src/slave.cpp +++ b/components/control/cpp/src/slave.cpp @@ -10,7 +10,7 @@ static void netLog(void* user_data, const loguru::Message& message) { //net->publish("log", message.preamble, message.message); } -Slave::Slave(Universe *net, ftl::Configurable *root) { +Slave::Slave(Universe *net, ftl::Configurable *root) : net_(net) { net->bind("restart", []() { LOG(WARNING) << "Remote restart..."; //exit(1); @@ -36,5 +36,8 @@ Slave::Slave(Universe *net, ftl::Configurable *root) { } Slave::~Slave() { - + net_->unbind("restart"); + net_->unbind("shutdown"); + net_->unbind("update_cfg"); + net_->unbind("get_cfg"); } diff --git a/components/net/cpp/include/ftl/net/dispatcher.hpp b/components/net/cpp/include/ftl/net/dispatcher.hpp index 7291adb43..0b4d3b34d 100644 --- a/components/net/cpp/include/ftl/net/dispatcher.hpp +++ b/components/net/cpp/include/ftl/net/dispatcher.hpp @@ -119,6 +119,13 @@ class Dispatcher { return std::make_unique<msgpack::object_handle>(result, std::move(z)); })); } + + void unbind(const std::string &name) { + auto i = funcs_.find(name); + if (i != funcs_.end()) { + funcs_.erase(i); + } + } std::vector<std::string> getBindings() const; diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp index 21a5da2ea..0c02dbe45 100644 --- a/components/net/cpp/include/ftl/net/universe.hpp +++ b/components/net/cpp/include/ftl/net/universe.hpp @@ -80,7 +80,9 @@ class Universe : public ftl::Configurable { */ template <typename F> void bind(const std::string &name, F func); - + + void unbind(const std::string &name); + /** * Subscribe a function to a resource. The subscribed function is * triggered whenever that resource is published to. It is akin to @@ -205,6 +207,7 @@ class Universe : public ftl::Configurable { template <typename F> void Universe::bind(const std::string &name, F func) { + // CHECK Need mutex? disp_.bind(name, func, typename ftl::internal::func_kind_info<F>::result_kind(), typename ftl::internal::func_kind_info<F>::args_kind()); diff --git a/components/net/cpp/src/dispatcher.cpp b/components/net/cpp/src/dispatcher.cpp index 7bfd7352c..719ae2b65 100644 --- a/components/net/cpp/src/dispatcher.cpp +++ b/components/net/cpp/src/dispatcher.cpp @@ -155,7 +155,7 @@ void ftl::net::Dispatcher::enforce_arg_count(std::string const &func, std::size_ void ftl::net::Dispatcher::enforce_unique_name(std::string const &func) { auto pos = funcs_.find(func); if (pos != end(funcs_)) { - LOG(ERROR) << "RPC non unique binding for " << func; + LOG(FATAL) << "RPC non unique binding for '" << func << "'"; throw -1; } } diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp index 04404e8da..750258c36 100644 --- a/components/net/cpp/src/universe.cpp +++ b/components/net/cpp/src/universe.cpp @@ -96,6 +96,11 @@ Peer *Universe::connect(const string &addr) { return p; } +void Universe::unbind(const std::string &name) { + unique_lock<mutex> lk(net_mutex_); + disp_.unbind(name); +} + int Universe::waitConnections() { int count = 0; for (auto p : peers_) { diff --git a/components/rgbd-sources/src/net_source.cpp b/components/rgbd-sources/src/net_source.cpp index 7a9d3cbe2..cc2e8461a 100644 --- a/components/rgbd-sources/src/net_source.cpp +++ b/components/rgbd-sources/src/net_source.cpp @@ -68,7 +68,12 @@ NetSource::NetSource(nlohmann::json &config, ftl::net::Universe *net) } NetSource::~NetSource() { - // TODO Unsubscribe + auto uri = get<string>("uri"); + + // TODO(Nick) If URI changes then must unbind + rebind. + if (uri) { + net_->unbind(*uri); + } } void NetSource::_recv(const vector<unsigned char> &jpg, const vector<unsigned char> &d) { diff --git a/components/rgbd-sources/src/rgbd_streamer.cpp b/components/rgbd-sources/src/rgbd_streamer.cpp index 6aefb9725..a5b9804b4 100644 --- a/components/rgbd-sources/src/rgbd_streamer.cpp +++ b/components/rgbd-sources/src/rgbd_streamer.cpp @@ -69,7 +69,12 @@ Streamer::Streamer(nlohmann::json &config, Universe *net) } Streamer::~Streamer() { - // TODO Unbind everything from net.... + net_->unbind("find_stream"); + net_->unbind("list_streams"); + net_->unbind("source_calibration"); + net_->unbind("get_stream"); + net_->unbind("sync_streams"); + net_->unbind("ping_streamer"); pool_.stop(); } -- GitLab