7 #define epicsExportSharedSymbols 19 if(addr.sa.sa_family<o.addr.sa.sa_family)
21 if(addr.sa.sa_family>o.addr.sa.sa_family)
23 if(addr.ia.sin_addr.s_addr<o.addr.ia.sin_addr.s_addr)
25 if(addr.ia.sin_addr.s_addr>o.addr.ia.sin_addr.s_addr)
27 if(addr.ia.sin_port<o.addr.ia.sin_port)
29 if(addr.ia.sin_port>o.addr.ia.sin_port)
45 std::tr1::shared_ptr<pvd::Mutex>&
lock = owner->locks[key];
61 assert(mutex.use_count()>=2);
63 if(mutex.use_count()==2) {
65 owner->locks.erase(key);
68 assert(mutex.use_count()==1);
74 if(!transports.empty())
80 const Key key(address, prio);
84 transports_t::iterator it(transports.find(key));
85 if(it!=transports.end()) {
88 return Transport::shared_pointer();
93 const Key key(ptr->getRemoteAddress(), ptr->getPriority());
97 std::pair<transports_t::iterator, bool> itpair(transports.insert(std::make_pair(key, ptr)));
105 const Key key(transport->getRemoteAddress(), transport->getPriority());
106 Transport::shared_pointer ret;
109 transports_t::iterator it(transports.find(key));
110 if(it!=transports.end()) {
111 ret.swap(it->second);
112 transports.erase(it);
117 #define LEAK_CHECK(PTR, NAME) if((PTR) && !(PTR).unique()) { std::cerr<<"Leaking Transport " NAME " use_count="<<(PTR).use_count()<<"\n"<<show_referrers(PTR, false);} 124 transports.swap(temp);
130 LOG(
logLevelDebug,
"Context still has %zu transport(s) active and closing...", temp.size());
132 for(transports_t::iterator it(temp.begin()), end(temp.end());
138 for(transports_t::iterator it(temp.begin()), end(temp.end());
141 const Transport::shared_pointer& transport = it->second;
142 transport->waitJoin();
144 if(!transport.unique()) {
146 transport->getRemoteName().c_str(),
147 (unsigned)transport.use_count());
155 return transports.size();
162 transportArray.reserve(transportArray.size() + transports.size());
164 for(transports_t::const_iterator it(transports.begin()), end(transports.end());
167 const Key& key = it->first;
168 const Transport::shared_pointer& tr = it->second;
171 transportArray.push_back(tr);
#define assert(exp)
Declare that a condition should be true.
#define THROW_EXCEPTION2(TYPE, MSG)
Transport::shared_pointer remove(Transport::shared_pointer const &transport)
TODO only here because of the Lockable.
A lock for multithreading.
void toArray(transportVector_t &transportArray, const osiSockAddr *dest=0)
#define LOG(level, format,...)
Transport::shared_pointer get(const osiSockAddr &address, epics::pvData::int16 prio)
bool operator<(shared_ptr< T > const &a, shared_ptr< U > const &b) BOOST_NOEXCEPT
std::vector< Transport::shared_pointer > transportVector_t
#define LEAK_CHECK(PTR, NAME)
Reservation(TransportRegistry *owner, const osiSockAddr &address, epics::pvData::int16 prio)
void install(const Transport::shared_pointer &ptr)
int epicsStdCall sockAddrAreIdentical(const osiSockAddr *plhs, const osiSockAddr *prhs)