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