Commit dbe880af authored by Dominik Charousset's avatar Dominik Charousset

Do not iterate namespace while changing it

parent 08c85d65
...@@ -78,6 +78,11 @@ class actor_namespace { ...@@ -78,6 +78,11 @@ class actor_namespace {
*/ */
size_t count_proxies(const key_type& node); size_t count_proxies(const key_type& node);
/**
* Returns all proxies for `node`.
*/
std::vector<actor_proxy_ptr> get_all();
/** /**
* Returns all proxies for `node`. * Returns all proxies for `node`.
*/ */
...@@ -115,18 +120,6 @@ class actor_namespace { ...@@ -115,18 +120,6 @@ class actor_namespace {
*/ */
void clear(); void clear();
template <class F>
void for_each(F fun) {
for (auto& outer : m_proxies) {
for (auto& inner : outer.second) {
auto ptr = inner.second->get();
if (ptr) {
fun(ptr);
}
}
}
}
private: private:
backend& m_backend; backend& m_backend;
std::map<key_type, proxy_map> m_proxies; std::map<key_type, proxy_map> m_proxies;
......
...@@ -87,13 +87,26 @@ size_t actor_namespace::count_proxies(const key_type& node) { ...@@ -87,13 +87,26 @@ size_t actor_namespace::count_proxies(const key_type& node) {
return (i != m_proxies.end()) ? i->second.size() : 0; return (i != m_proxies.end()) ? i->second.size() : 0;
} }
std::vector<actor_proxy_ptr> actor_namespace::get_all() {
std::vector<actor_proxy_ptr> result;
for (auto& outer : m_proxies) {
for (auto& inner : outer.second) {
auto ptr = inner.second->get();
if (ptr) {
result.push_back(std::move(ptr));
}
}
}
return result;
}
std::vector<actor_proxy_ptr> actor_namespace::get_all(const key_type& node) { std::vector<actor_proxy_ptr> actor_namespace::get_all(const key_type& node) {
std::vector<actor_proxy_ptr> result; std::vector<actor_proxy_ptr> result;
auto& submap = m_proxies[node]; auto& submap = m_proxies[node];
for (auto& kvp : submap) { for (auto& kvp : submap) {
auto ptr = kvp.second->get(); auto ptr = kvp.second->get();
if (ptr) { if (ptr) {
result.push_back(ptr); result.push_back(std::move(ptr));
} }
} }
return result; return result;
......
...@@ -696,9 +696,11 @@ actor_proxy_ptr basp_broker::make_proxy(const node_id& nid, actor_id aid) { ...@@ -696,9 +696,11 @@ actor_proxy_ptr basp_broker::make_proxy(const node_id& nid, actor_id aid) {
void basp_broker::on_exit() { void basp_broker::on_exit() {
CAF_LOG_TRACE(""); CAF_LOG_TRACE("");
// kill all remaining proxies // kill all remaining proxies
m_namespace.for_each([](const actor_proxy_ptr& ptr) { auto proxies = m_namespace.get_all();
ptr->kill_proxy(exit_reason::remote_link_unreachable); for (auto& proxy : proxies) {
}); CAF_REQUIRE(proxy != nullptr);
proxy->kill_proxy(exit_reason::remote_link_unreachable);
}
m_namespace.clear(); m_namespace.clear();
// remove all remaining state // remove all remaining state
m_ctx.clear(); m_ctx.clear();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment