diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/network.cpp | 14 | ||||
-rw-r--r-- | src/network.h | 6 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/network.cpp b/src/network.cpp index 8d318f7..dafab67 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -48,8 +48,9 @@ const Bhv<LocalState> & Server::localState() const return p->localState; } -const Identity & Server::identity() const +Identity Server::identity() const { + shared_lock lock(p->selfMutex); return p->self; } @@ -293,7 +294,7 @@ shared_ptr<Server::Priv> Server::Priv::getptr() void Server::Priv::doListen() { vector<uint8_t> buf, decrypted, *current; - unique_lock<mutex> lock(dataMutex); + unique_lock lock(dataMutex); for (; !finish; lock.lock()) { sockaddr_in paddr; @@ -340,7 +341,9 @@ void Server::Priv::doListen() ReplyBuilder reply; - scoped_lock<mutex> hlock(dataMutex); + scoped_lock hlock(dataMutex); + shared_lock slock(selfMutex); + handlePacket(peer, *header, reply); peer.updateIdentity(reply); peer.updateChannel(reply); @@ -359,13 +362,14 @@ void Server::Priv::doListen() void Server::Priv::doAnnounce() { - unique_lock<mutex> lock(dataMutex); + unique_lock lock(dataMutex); auto lastAnnounce = steady_clock::now() - announceInterval; while (!finish) { auto now = steady_clock::now(); if (lastAnnounce + announceInterval < now) { + shared_lock slock(selfMutex); TransportHeader header({ { TransportHeader::Type::AnnounceSelf, *self.ref() } }); @@ -578,6 +582,8 @@ void Server::Priv::handlePacket(Server::Peer & peer, const TransportHeader & hea void Server::Priv::handleLocalHeadChange(const Head<LocalState> & head) { scoped_lock lock(dataMutex); + scoped_lock slock(selfMutex); + if (auto id = head->identity()) { if (*id != self) { self = *id; diff --git a/src/network.h b/src/network.h index c620cf6..5a656cb 100644 --- a/src/network.h +++ b/src/network.h @@ -6,6 +6,7 @@ #include <condition_variable> #include <mutex> +#include <shared_mutex> #include <thread> #include <vector> @@ -15,6 +16,8 @@ using std::condition_variable; using std::monostate; using std::mutex; using std::optional; +using std::shared_lock; +using std::shared_mutex; using std::shared_ptr; using std::string; using std::thread; @@ -162,8 +165,9 @@ struct Server::Priv condition_variable announceCondvar; bool finish = false; + shared_mutex selfMutex; Identity self; - Bhv<LocalState> localState; + const Bhv<LocalState> localState; thread threadListen; thread threadAnnounce; |