@ -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 ;
}