diff --git a/nmmsender.cc b/nmmsender.cc index 5d30e26..c3d5c28 100644 --- a/nmmsender.cc +++ b/nmmsender.cc @@ -187,6 +187,7 @@ void NMMSender::emitNMM(const NavMonMessage& nmm) void NMMSender::emitNMM(const std::string& out) { + std::lock_guard l(d_destslock); for(auto& d : d_dests) { d->emitNMM(out, d_compress); } @@ -222,6 +223,7 @@ try cout<<"Had a new connection from "<(); nd->dst="source"; + std::lock_guard l(ns.d_destslock); ns.d_dests.push_back(std::move(nd)); std::thread t(&NMMSender::sendTCPListenerThread, &ns, ns.d_dests.rbegin()->get(), fd, remote); @@ -282,15 +284,16 @@ void NMMSender::sendTCPListenerThread(Destination* d, int fd, ComboAddress addr) if (d_debug) { cerr<dst <<" via "<< addr.toStringWithPort()<<" had error"; } } - // need a lock here, but I think think this is the right one - std::lock_guard mut(d->mut); - cerr<<"Done with serving client "< l(d_destslock); + d_dests.erase(remove_if(d_dests.begin(), d_dests.end(), [d](const auto& a) { // cerr<<(void*) a.get()<< " ==? " <<(void*) d <(); d->fd = fd; + std::lock_guard l(d_destslock); d_dests.push_back(std::move(d)); } void addDestination(const std::string& dest) { auto d = std::make_unique(); d->dst = dest; + std::lock_guard l(d_destslock); d_dests.push_back(std::move(d)); } void addListener(const std::string& dest) @@ -43,6 +45,7 @@ public: auto d = std::make_unique(); d->dst = dest; d->listener = true; + std::lock_guard l(d_destslock); d_dests.push_back(std::move(d)); } @@ -78,6 +81,7 @@ public: } private: + std::mutex d_destslock; std::vector> d_dests; std::vector> d_thread; };