void nsHostResolver::ThreadFunc(void *arg) { LOG(("DNS lookup thread starting execution.\n")); static nsThreadPoolNaming naming; naming.SetThreadPoolName(NS_LITERAL_CSTRING("DNS Resolver")); #if defined(RES_RETRY_ON_FAILURE) nsResState rs; #endif nsHostResolver *resolver = (nsHostResolver *)arg; nsHostRecord *rec; PRAddrInfo *prai = nullptr; while (resolver->GetHostToLookup(&rec)) { LOG(("Calling getaddrinfo for host [%s].\n", rec->host)); int flags = PR_AI_ADDRCONFIG; if (!(rec->flags & RES_CANON_NAME)) flags |= PR_AI_NOCANONNAME; TimeStamp startTime = TimeStamp::Now(); prai = PR_GetAddrInfoByName(rec->host, rec->af, flags); #if defined(RES_RETRY_ON_FAILURE) if (!prai && rs.Reset()) prai = PR_GetAddrInfoByName(rec->host, rec->af, flags); #endif TimeDuration elapsed = TimeStamp::Now() - startTime; uint32_t millis = static_cast<uint32_t>(elapsed.ToMilliseconds()); // convert error code to nsresult nsresult status; AddrInfo *ai = nullptr; if (prai) { ai = new AddrInfo(rec->host, prai); PR_FreeAddrInfo(prai); status = NS_OK; Telemetry::Accumulate(!rec->addr_info_gencnt ? Telemetry::DNS_LOOKUP_TIME : Telemetry::DNS_RENEWAL_TIME, millis); } else { status = NS_ERROR_UNKNOWN_HOST; Telemetry::Accumulate(Telemetry::DNS_FAILED_LOOKUP_TIME, millis); } // OnLookupComplete may release "rec", log before we lose it. LOG(("Lookup completed for host [%s].\n", rec->host)); resolver->OnLookupComplete(rec, status, ai); } NS_RELEASE(resolver); LOG(("DNS lookup thread ending execution.\n")); }
void nsHostResolver::ThreadFunc(void *arg) { LOG(("DNS lookup thread starting execution.\n")); static nsThreadPoolNaming naming; naming.SetThreadPoolName(NS_LITERAL_CSTRING("DNS Resolver")); #if defined(RES_RETRY_ON_FAILURE) nsResState rs; #endif nsHostResolver *resolver = (nsHostResolver *)arg; nsHostRecord *rec; PRAddrInfo *prai = nullptr; while (resolver->GetHostToLookup(&rec)) { LOG(("Calling getaddrinfo for host [%s].\n", rec->host)); int flags = PR_AI_ADDRCONFIG; if (!(rec->flags & RES_CANON_NAME)) flags |= PR_AI_NOCANONNAME; TimeStamp startTime = TimeStamp::Now(); MOZ_EVENT_TRACER_EXEC(rec, "net::dns::resolve"); // We need to remove IPv4 records manually // because PR_GetAddrInfoByName doesn't support PR_AF_INET6. bool disableIPv4 = rec->af == PR_AF_INET6; uint16_t af = disableIPv4 ? PR_AF_UNSPEC : rec->af; prai = PR_GetAddrInfoByName(rec->host, af, flags); #if defined(RES_RETRY_ON_FAILURE) if (!prai && rs.Reset()) prai = PR_GetAddrInfoByName(rec->host, af, flags); #endif TimeDuration elapsed = TimeStamp::Now() - startTime; uint32_t millis = static_cast<uint32_t>(elapsed.ToMilliseconds()); // convert error code to nsresult nsresult status; AddrInfo *ai = nullptr; if (prai) { ai = new AddrInfo(rec->host, prai, disableIPv4); PR_FreeAddrInfo(prai); if (ai->mAddresses.isEmpty()) { delete ai; ai = nullptr; } } if (ai) { status = NS_OK; Telemetry::Accumulate(!rec->addr_info_gencnt ? Telemetry::DNS_LOOKUP_TIME : Telemetry::DNS_RENEWAL_TIME, millis); } else { status = NS_ERROR_UNKNOWN_HOST; Telemetry::Accumulate(Telemetry::DNS_FAILED_LOOKUP_TIME, millis); } // OnLookupComplete may release "rec", log before we lose it. LOG(("Lookup completed for host [%s].\n", rec->host)); resolver->OnLookupComplete(rec, status, ai); } NS_RELEASE(resolver); LOG(("DNS lookup thread ending execution.\n")); }