| Index: net/tools/quic/synchronous_host_resolver.cc
|
| diff --git a/net/tools/quic/synchronous_host_resolver.cc b/net/tools/quic/synchronous_host_resolver.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7955186f5d071510338b4c2b07eb9b5fa6b9a801
|
| --- /dev/null
|
| +++ b/net/tools/quic/synchronous_host_resolver.cc
|
| @@ -0,0 +1,109 @@
|
| +// Copyright (c) 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "net/tools/quic/synchronous_host_resolver.h"
|
| +
|
| +#include "base/at_exit.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/threading/simple_thread.h"
|
| +#include "net/base/host_port_pair.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/dns/host_resolver_impl.h"
|
| +#include "net/dns/single_request_host_resolver.h"
|
| +
|
| +namespace net {
|
| +
|
| +namespace tools {
|
| +
|
| +namespace {
|
| +
|
| +class ResolverThread : public base::SimpleThread {
|
| + public:
|
| + ResolverThread();
|
| +
|
| + ~ResolverThread() override;
|
| +
|
| + // Called on the main thread.
|
| + int Resolve(const std::string& host, AddressList* addresses);
|
| +
|
| + // SimpleThread methods:
|
| + void Run() override;
|
| +
|
| + private:
|
| + void OnResolutionComplete(int rv);
|
| +
|
| + AddressList* addresses_;
|
| + std::string host_;
|
| + int rv_;
|
| +
|
| + base::WaitableEvent resolved_; // Notified when the resolution is complete.
|
| +
|
| + base::WeakPtrFactory<ResolverThread> weak_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ResolverThread);
|
| +};
|
| +
|
| +ResolverThread::ResolverThread()
|
| + : SimpleThread("resolver_thread"),
|
| + rv_(ERR_UNEXPECTED),
|
| + resolved_(true, false),
|
| + weak_factory_(this) {}
|
| +
|
| +ResolverThread::~ResolverThread() {}
|
| +
|
| +void ResolverThread::Run() {
|
| + base::AtExitManager exit_manager;
|
| + base::MessageLoopForIO loop;
|
| +
|
| + net::HostResolver::Options options;
|
| + options.max_concurrent_resolves = 6;
|
| + options.max_retry_attempts = 3u;
|
| + net::NetLog net_log;
|
| + scoped_ptr<net::HostResolverImpl> resolver_impl(
|
| + new net::HostResolverImpl(options, &net_log));
|
| + SingleRequestHostResolver resolver(resolver_impl.get());
|
| +
|
| + HostPortPair host_port_pair(host_, 80);
|
| +
|
| + rv_ = resolver.Resolve(
|
| + HostResolver::RequestInfo(host_port_pair), DEFAULT_PRIORITY,
|
| + addresses_,
|
| + base::Bind(&ResolverThread::OnResolutionComplete,
|
| + weak_factory_.GetWeakPtr()),
|
| + BoundNetLog());
|
| +
|
| + if (rv_ != ERR_IO_PENDING) {
|
| + resolved_.Signal();
|
| + }
|
| +
|
| + while (!resolved_.IsSignaled()) {
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| + }
|
| +}
|
| +
|
| +int ResolverThread::Resolve(const std::string& host, AddressList* addresses) {
|
| + host_ = host;
|
| + addresses_ = addresses;
|
| + this->Start();
|
| + resolved_.Wait();
|
| + this->Join();
|
| + return rv_;
|
| +}
|
| +
|
| +void ResolverThread::OnResolutionComplete(int rv) {
|
| + rv_ = rv;
|
| + resolved_.Signal();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// static
|
| +int SynchronousHostResolver::Resolve(const std::string& host,
|
| + AddressList* addresses) {
|
| + ResolverThread resolver;
|
| + return resolver.Resolve(host, addresses);
|
| +}
|
| +
|
| +} // namespace tools
|
| +} // namespace net
|
|
|