diff options
Diffstat (limited to 'node')
-rw-r--r-- | node/Topology.cpp | 38 | ||||
-rw-r--r-- | node/Topology.hpp | 2 |
2 files changed, 22 insertions, 18 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp index 9027eff1..031c0b1b 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -146,26 +146,30 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta) return SharedPtr<Peer>(); } - Mutex::Lock _l(_lock); - - SharedPtr<Peer> &ap = _peers[zta]; - - if (ap) { - ap->use(RR->node->now()); - return ap; + { + Mutex::Lock _l(_lock); + const SharedPtr<Peer> *const ap = _peers.get(zta); + if (ap) { + (*ap)->use(RR->node->now()); + return *ap; + } } - Identity id(_getIdentity(zta)); - if (id) { - try { - ap = SharedPtr<Peer>(new Peer(RR->identity,id)); - ap->use(RR->node->now()); - return ap; - } catch ( ... ) {} // invalid identity? - } + try { + Identity id(_getIdentity(zta)); + if (id) { + SharedPtr<Peer> np(new Peer(RR->identity,id)); + { + Mutex::Lock _l(_lock); + SharedPtr<Peer> &ap = _peers[zta]; + if (!ap) + ap.swap(np); + ap->use(RR->node->now()); + return ap; + } + } + } catch ( ... ) {} // invalid identity on disk? - // If we get here it means we read an invalid cache identity or had some other error - _peers.erase(zta); return SharedPtr<Peer>(); } diff --git a/node/Topology.hpp b/node/Topology.hpp index b9f063c8..d6f453ac 100644 --- a/node/Topology.hpp +++ b/node/Topology.hpp @@ -87,7 +87,7 @@ public: inline SharedPtr<Peer> getPeerNoCache(const Address &zta,const uint64_t now) { Mutex::Lock _l(_lock); - const SharedPtr<Peer> *ap = _peers.get(zta); + const SharedPtr<Peer> *const ap = _peers.get(zta); if (ap) { (*ap)->use(now); return *ap; |