SharedPtr<Peer> Topology::getPeer(const Address &zta) { if (zta == RR->identity.address()) { TRACE("BUG: ignored attempt to getPeer() for self, returned NULL"); return SharedPtr<Peer>(); } const uint64_t now = RR->node->now(); Mutex::Lock _l(_lock); SharedPtr<Peer> &ap = _activePeers[zta]; if (ap) { ap->use(now); return ap; } Identity id(_getIdentity(zta)); if (id) { try { ap = SharedPtr<Peer>(new Peer(RR->identity,id)); ap->use(now); return ap; } catch ( ... ) {} // invalid identity? } _activePeers.erase(zta); return SharedPtr<Peer>(); }
Identity Topology::getIdentity(const Address &zta) { { Mutex::Lock _l(_lock); const SharedPtr<Peer> *const ap = _peers.get(zta); if (ap) return (*ap)->identity(); } return _getIdentity(zta); }
SharedPtr<Peer> Topology::getPeer(const Address &zta) { if (zta == RR->identity.address()) { TRACE("BUG: ignored attempt to getPeer() for self, returned NULL"); return SharedPtr<Peer>(); } { Mutex::Lock _l(_lock); const SharedPtr<Peer> *const ap = _peers.get(zta); if (ap) { (*ap)->use(RR->node->now()); return *ap; } } try { Identity id(_getIdentity(zta)); if (id) { SharedPtr<Peer> np(new Peer(RR,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 ( ... ) { fprintf(stderr,"EXCEPTION in getPeer() part 2\n"); abort(); } // invalid identity on disk? return SharedPtr<Peer>(); }