| 238 | #endif |
| 239 | |
| 240 | TAddressString CNetAddressResolver::ToString(const TNetAddress& addr, float timeout) |
| 241 | { |
| 242 | m_lock.Lock(); |
| 243 | TAddressToNameCache::iterator iter = m_addressToNameCache.find(addr); |
| 244 | if (iter != m_addressToNameCache.end()) |
| 245 | { |
| 246 | // force reallocation! |
| 247 | TAddressString s = iter->second.c_str(); |
| 248 | m_lock.Unlock(); |
| 249 | return s; |
| 250 | } |
| 251 | _smart_ptr<CToStringRequest> pReq = new CToStringRequest(addr, m_lock, m_condOut); |
| 252 | m_requests.push(&*pReq); |
| 253 | m_cond.Notify(); |
| 254 | m_lock.Unlock(); |
| 255 | if (pReq->TimedWait(timeout)) |
| 256 | { |
| 257 | TAddressString temp; |
| 258 | if (pReq->GetResult(temp) == eNRR_Succeeded) |
| 259 | return temp.c_str(); // force reallocation! |
| 260 | } |
| 261 | TAddressString fallback; |
| 262 | CResolverToNumericStringVisitor visitor(fallback); |
| 263 | boost::apply_visitor(visitor, addr); |
| 264 | return fallback; |
| 265 | } |
| 266 | |
| 267 | TAddressString CNetAddressResolver::ToNumericString(const TNetAddress& addr) |
| 268 | { |