diff options
| author | Grant Limberg <glimberg@gmail.com> | 2015-10-21 17:35:38 -0700 |
|---|---|---|
| committer | Grant Limberg <glimberg@gmail.com> | 2015-10-21 17:35:38 -0700 |
| commit | 6471c1f4e26c0230b40bf0102a52493aa78236b9 (patch) | |
| tree | b8791931f4d4f6becbbab794f2a0d95d9363054d /node/Topology.cpp | |
| parent | 21ae423feb0e63cdbdd47be921e257c1d59de27a (diff) | |
| parent | a46514b397acdf42451d41398ef77eec60744256 (diff) | |
| download | infinitytier-6471c1f4e26c0230b40bf0102a52493aa78236b9.tar.gz infinitytier-6471c1f4e26c0230b40bf0102a52493aa78236b9.zip | |
Merge branch 'adamierymenko-dev' into windows-ui
Diffstat (limited to 'node/Topology.cpp')
| -rw-r--r-- | node/Topology.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp index 56ca47c8..88c8856c 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -122,18 +122,22 @@ Topology::~Topology() SharedPtr<Peer> Topology::addPeer(const SharedPtr<Peer> &peer) { if (peer->address() == RR->identity.address()) { - TRACE("BUG: addNewPeer() caught and ignored attempt to add peer for self"); + TRACE("BUG: addPeer() caught and ignored attempt to add peer for self"); throw std::logic_error("cannot add peer for self"); } - const uint64_t now = RR->node->now(); - Mutex::Lock _l(_lock); - - SharedPtr<Peer> &p = _peers.set(peer->address(),peer); - p->use(now); - saveIdentity(p->identity()); + SharedPtr<Peer> np; + { + Mutex::Lock _l(_lock); + SharedPtr<Peer> &hp = _peers[peer->address()]; + if (!hp) + hp = peer; + np = hp; + } + np->use(RR->node->now()); + saveIdentity(np->identity()); - return p; + return np; } SharedPtr<Peer> Topology::getPeer(const Address &zta) @@ -143,13 +147,12 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta) return SharedPtr<Peer>(); } - const uint64_t now = RR->node->now(); Mutex::Lock _l(_lock); SharedPtr<Peer> &ap = _peers[zta]; if (ap) { - ap->use(now); + ap->use(RR->node->now()); return ap; } @@ -157,13 +160,13 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta) if (id) { try { ap = SharedPtr<Peer>(new Peer(RR->identity,id)); - ap->use(now); + ap->use(RR->node->now()); return ap; } catch ( ... ) {} // invalid identity? } + // If we get here it means we read an invalid cache identity or had some other error _peers.erase(zta); - return SharedPtr<Peer>(); } |
