diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2018-01-11 14:29:57 -0800 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2018-01-11 14:29:57 -0800 |
| commit | f87326fc21fb6db0944730ba1fe961d8bb249450 (patch) | |
| tree | 518cd8a9ef3f44dafae5065870571e6ff65429fe /service/OneService.cpp | |
| parent | 0574a70fac7ead502b983252583d5f05191b29cb (diff) | |
| download | infinitytier-f87326fc21fb6db0944730ba1fe961d8bb249450.tar.gz infinitytier-f87326fc21fb6db0944730ba1fe961d8bb249450.zip | |
Fixes for lock ordering -- GitHub issue #573
Diffstat (limited to 'service/OneService.cpp')
| -rw-r--r-- | service/OneService.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/service/OneService.cpp b/service/OneService.cpp index 487ff4d0..7d254124 100644 --- a/service/OneService.cpp +++ b/service/OneService.cpp @@ -825,7 +825,24 @@ public: // Sync multicast group memberships if ((now - lastTapMulticastGroupCheck) >= ZT_TAP_CHECK_MULTICAST_INTERVAL) { lastTapMulticastGroupCheck = now; - Mutex::Lock _l(_nets_m); + std::vector< std::pair< uint64_t,std::pair< std::vector<MulticastGroup>,std::vector<MulticastGroup> > > > mgChanges; + { + Mutex::Lock _l(_nets_m); + mgChanges.reserve(_nets.size() + 1); + for(std::map<uint64_t,NetworkState>::const_iterator n(_nets.begin());n!=_nets.end();++n) { + if (n->second.tap) { + mgChanges.push_back(std::pair< uint64_t,std::pair< std::vector<MulticastGroup>,std::vector<MulticastGroup> > >(n->first,std::pair< std::vector<MulticastGroup>,std::vector<MulticastGroup> >())); + n->second.tap->scanMulticastGroups(mgChanges.back().second.first,mgChanges.back().second.second); + } + } + } + for(std::vector< std::pair< uint64_t,std::pair< std::vector<MulticastGroup>,std::vector<MulticastGroup> > > >::iterator c(mgChanges.begin());c!=mgChanges.end();++c) { + for(std::vector<MulticastGroup>::iterator m(c->second.first.begin());m!=c->second.first.end();++m) + _node->multicastSubscribe((void *)0,c->first,m->mac().toInt(),m->adi()); + for(std::vector<MulticastGroup>::iterator m(c->second.second.begin());m!=c->second.second.end();++m) + _node->multicastUnsubscribe(c->first,m->mac().toInt(),m->adi()); + } + /* for(std::map<uint64_t,NetworkState>::const_iterator n(_nets.begin());n!=_nets.end();++n) { if (n->second.tap) { std::vector<MulticastGroup> added,removed; @@ -836,6 +853,7 @@ public: _node->multicastUnsubscribe(n->first,m->mac().toInt(),m->adi()); } } + */ } // Sync information about physical network interfaces |
