summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node/Node.cpp34
-rw-r--r--node/Node.hpp24
2 files changed, 25 insertions, 33 deletions
diff --git a/node/Node.cpp b/node/Node.cpp
index 60aeff1f..85011434 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -141,7 +141,7 @@ Node::Node(
Node::~Node()
{
Mutex::Lock _l(_networks_m);
- _networks.clear();
+ _networks.clear(); // ensure that networks are destroyed before shutdown
delete RR->sa;
delete RR->topology;
delete RR->antiRec;
@@ -236,14 +236,13 @@ ZT1_ResultCode Node::processBackgroundTasks(uint64_t now,volatile uint64_t *next
std::vector< SharedPtr<Network> > needConfig;
{
Mutex::Lock _l(_networks_m);
- for(std::vector< SharedPtr<Network> >::const_iterator n(_networks.begin());n!=_networks.end();++n) {
- SharedPtr<NetworkConfig> nc((*n)->config2());
- if (((now - (*n)->lastConfigUpdate()) >= ZT_NETWORK_AUTOCONF_DELAY)||(!nc))
- needConfig.push_back(*n);
+ for(std::vector< std::pair< uint64_t,SharedPtr<Network> > >::const_iterator n(_networks.begin());n!=_networks.end();++n) {
+ SharedPtr<NetworkConfig> nc(n->second->config2());
+ if (((now - n->second->lastConfigUpdate()) >= ZT_NETWORK_AUTOCONF_DELAY)||(!nc))
+ needConfig.push_back(n->second);
if (nc)
networkRelays.insert(networkRelays.end(),nc->relays().begin(),nc->relays().end());
}
- std::sort(_networks.begin(),_networks.end());
}
// Request updated configuration for networks that need it
@@ -312,24 +311,21 @@ ZT1_ResultCode Node::join(uint64_t nwid)
{
Mutex::Lock _l(_networks_m);
SharedPtr<Network> nw = _network(nwid);
- if(!nw) {
- _networks.push_back(SharedPtr<Network>(new Network(RR,nwid)));
- std::sort(_networks.begin(),_networks.end());
- }
+ if(!nw)
+ _networks.push_back(std::pair< uint64_t,SharedPtr<Network> >(nwid,SharedPtr<Network>(new Network(RR,nwid))));
+ std::sort(_networks.begin(),_networks.end()); // will sort by nwid since it's the first in a pair<>
return ZT1_RESULT_OK;
}
ZT1_ResultCode Node::leave(uint64_t nwid)
{
+ std::vector< std::pair< uint64_t,SharedPtr<Network> > > newn;
Mutex::Lock _l(_networks_m);
- std::vector< SharedPtr<Network> >::iterator nwi = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator());
- if(nwi != _networks.end() && (*nwi)->id() == nwid) {
- (*nwi)->destroy();
- // erase element (replace by last)
- *nwi = _networks.back();
- _networks.pop_back();
- std::sort(_networks.begin(),_networks.end());
+ for(std::vector< std::pair< uint64_t,SharedPtr<Network> > >::const_iterator n(_networks.begin());n!=_networks.end();++n) {
+ if (n->first != nwid)
+ newn.push_back(*n);
}
+ _networks.swap(newn);
return ZT1_RESULT_OK;
}
@@ -432,8 +428,8 @@ ZT1_VirtualNetworkList *Node::networks() const
nl->networks = (ZT1_VirtualNetworkConfig *)(buf + sizeof(ZT1_VirtualNetworkList));
nl->networkCount = 0;
- for(std::vector< SharedPtr<Network> >::const_iterator n(_networks.begin());n!=_networks.end();++n)
- (*n)->externalConfig(&(nl->networks[nl->networkCount++]));
+ for(std::vector< std::pair< uint64_t,SharedPtr<Network> > >::const_iterator n(_networks.begin());n!=_networks.end();++n)
+ n->second->externalConfig(&(nl->networks[nl->networkCount++]));
return nl;
}
diff --git a/node/Node.hpp b/node/Node.hpp
index b0f4ab22..2d2898b5 100644
--- a/node/Node.hpp
+++ b/node/Node.hpp
@@ -163,8 +163,11 @@ public:
inline std::vector< SharedPtr<Network> > allNetworks() const
{
+ std::vector< SharedPtr<Network> > nw;
Mutex::Lock _l(_networks_m);
- std::vector< SharedPtr<Network> > nw(_networks);
+ nw.reserve(_networks.size());
+ for(std::vector< std::pair< uint64_t, SharedPtr<Network> > >::const_iterator i=_networks.begin();i!=_networks.end();++i)
+ nw.push_back(i->second);
return nw;
}
@@ -205,21 +208,14 @@ public:
#endif
private:
- // for binary search on _networks
- struct NetworkComparator {
- bool operator()(const SharedPtr<Network> &n,uint64_t nwid) const {
- return n->id() < nwid;
- }
- };
-
inline SharedPtr<Network> _network(uint64_t nwid) const
{
- std::vector< SharedPtr<Network> >::const_iterator iter = std::lower_bound(_networks.begin(), _networks.end(), nwid, NetworkComparator());
- if(iter != _networks.end() && (*iter)->id() == nwid) {
- return *iter;
- } else {
- return SharedPtr<Network>();
+ // assumes _networks_m is locked
+ for(std::vector< std::pair< uint64_t, SharedPtr<Network> > >::const_iterator i=_networks.begin();i!=_networks.end();++i) {
+ if (i->first == nwid)
+ return i->second;
}
+ return SharedPtr<Network>();
}
RuntimeEnvironment _RR;
@@ -237,7 +233,7 @@ private:
//Dictionary _localConfig; // persisted as local.conf
//Mutex _localConfig_m;
- std::vector< SharedPtr<Network> > _networks;
+ std::vector< std::pair< uint64_t, SharedPtr<Network> > > _networks;
Mutex _networks_m;
Mutex _backgroundTasksLock;