Chromium Code Reviews| OLD | NEW | 
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/dns/dns_socket_pool.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "base/rand_util.h" | |
| 9 #include "net/base/ip_endpoint.h" | |
| 10 #include "net/base/net_errors.h" | |
| 11 #include "net/base/rand_callback.h" | |
| 12 #include "net/socket/client_socket_factory.h" | |
| 13 #include "net/udp/datagram_client_socket.h" | |
| 14 | |
| 15 namespace net { | |
| 16 | |
| 17 DnsSocketPool::DnsSocketPool() | |
| 18 : socket_factory_(NULL), | |
| 19 net_log_(NULL), | |
| 20 nameservers_(NULL), | |
| 21 initialized_(false) { | |
| 22 } | |
| 23 | |
| 24 void DnsSocketPool::Initialize( | |
| 25 ClientSocketFactory* socket_factory, | |
| 26 NetLog* net_log, | |
| 27 const std::vector<IPEndPoint>* nameservers) { | |
| 28 // net_log can be NULL if we don't want to log | |
| 29 CHECK(socket_factory && nameservers); | |
| 
 
szym
2012/09/14 20:49:27
use separate CHECKs, should probably use DCHECKs i
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 30 | |
| 31 CHECK(!initialized_); | |
| 32 | |
| 33 socket_factory_ = socket_factory; | |
| 34 net_log_ = net_log; | |
| 35 nameservers_ = nameservers; | |
| 36 initialized_ = true; | |
| 37 } | |
| 38 | |
| 39 // On Windows, we can't request specific (random) ports, since that will | |
| 40 // trigger firewall prompts, so request default ones, but keep a pile of | |
| 41 // them. Everywhere else, request fresh, random ports each time. | |
| 42 #if defined(OS_WIN) | |
| 43 static const DatagramSocket::BindType kBindType = DatagramSocket::DEFAULT_BIND; | |
| 
 
szym
2012/09/14 20:49:27
suggest anonymous namespace at the top of this fil
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 44 static const unsigned kInitialPoolSize = 256; | |
| 45 static const unsigned kAllocateMinSize = 256; | |
| 46 static const unsigned kRetainMaxSize = 0; | |
| 47 #else | |
| 48 static const DatagramSocket::BindType kBindType = DatagramSocket::RANDOM_BIND; | |
| 49 static const unsigned kInitialPoolSize = 0; | |
| 50 static const unsigned kAllocateMinSize = 0; | |
| 51 static const unsigned kRetainMaxSize = 0; | |
| 52 #endif | |
| 53 | |
| 54 scoped_ptr<DatagramClientSocket> DnsSocketPool::CreateConnectedSocket( | |
| 55 unsigned server_index) { | |
| 56 CHECK(server_index < nameservers_->size()); | |
| 
 
szym
2012/09/14 20:49:27
Should probably use DCHECK. Use DCHECK_LT
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 57 | |
| 58 DatagramClientSocket* socket; | |
| 
 
szym
2012/09/14 20:49:27
Use scoped_ptr here so that you don't need to worr
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 59 | |
| 60 NetLog::Source no_source; | |
| 61 socket = socket_factory_->CreateDatagramClientSocket( | |
| 62 kBindType, base::Bind(&base::RandInt), net_log_, no_source); | |
| 63 | |
| 64 if (!socket) { | |
| 65 LOG(WARNING) << "Failed to create socket."; | |
| 66 return scoped_ptr<DatagramClientSocket>(NULL); | |
| 
 
szym
2012/09/14 20:49:27
nit: indent
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 67 } | |
| 68 | |
| 69 int rv = socket->Connect((*nameservers_)[server_index]); | |
| 70 if (rv != OK) { | |
| 71 LOG(WARNING) << "Failed to connect socket: " << rv; | |
| 72 delete socket; | |
| 73 return scoped_ptr<DatagramClientSocket>(NULL); | |
| 74 } | |
| 75 | |
| 76 return scoped_ptr<DatagramClientSocket>(socket); | |
| 77 } | |
| 78 | |
| 79 class DefaultDnsSocketPool : public DnsSocketPool { | |
| 80 public: | |
| 81 virtual void Initialize( | |
| 82 ClientSocketFactory* socket_factory, | |
| 83 NetLog* net_log, | |
| 84 const std::vector<IPEndPoint>* nameservers); | |
| 
 
szym
2012/09/14 20:49:27
All three need OVERRIDE.
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 85 virtual scoped_ptr<DatagramClientSocket> AllocateSocket( | |
| 86 unsigned server_index); | |
| 87 virtual void FreeSocket( | |
| 88 unsigned server_index, | |
| 89 scoped_ptr<DatagramClientSocket> socket); | |
| 90 private: | |
| 
 
szym
2012/09/14 20:49:27
Add empty line above.
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 91 std::vector<std::vector<DatagramClientSocket*> > pools_; | |
| 
 
szym
2012/09/14 20:49:27
DISALLOW_COPY_AND_ASSIGN
 
szym
2012/09/14 20:49:27
All of the sockets leak out in ~DefaultDnsSocketPo
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
szym
2012/09/26 11:16:12
Missed the one about leak.
 
Deprecated (see juliatuttle)
2012/09/26 20:44:50
Done.
 
 | |
| 92 }; | |
| 93 | |
| 94 // static | |
| 95 scoped_ptr<DnsSocketPool> DnsSocketPool::MakeDefault() { | |
| 96 DefaultDnsSocketPool* default_pool = new DefaultDnsSocketPool(); | |
| 97 DnsSocketPool* pool = static_cast<DnsSocketPool*>(default_pool); | |
| 
 
szym
2012/09/14 20:49:27
no need for static_cast to base class pointer
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 98 return scoped_ptr<DnsSocketPool>(pool); | |
| 
 
szym
2012/09/14 20:49:27
scoped_ptr<DnsSocketPool>(new DefaultDnsSocketPool
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 99 } | |
| 100 | |
| 101 void DefaultDnsSocketPool::Initialize( | |
| 102 ClientSocketFactory* socket_factory, | |
| 103 NetLog* net_log, | |
| 104 const std::vector<IPEndPoint>* nameservers) OVERRIDE { | |
| 
 
szym
2012/09/14 20:49:27
I suggest you DCHECK that |pools_| is empty to enf
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
InitializeInternal already keeps a flag and enforc
 
 | |
| 105 DnsSocketPool::Initialize(socket_factory, net_log, nameservers); | |
| 106 | |
| 107 const unsigned num_servers = nameservers->size(); | |
| 108 pools_.resize(num_servers); | |
| 109 for (unsigned server_index = 0; server_index < num_servers; ++server_index) { | |
| 110 std::vector<DatagramClientSocket*>& pool = pools_[server_index]; | |
| 111 for (unsigned pool_index = 0; pool_index < kInitialPoolSize; ++pool_index) { | |
| 112 DatagramClientSocket* socket = | |
| 113 CreateConnectedSocket(server_index).release(); | |
| 114 if (!socket) { | |
| 
 
szym
2012/09/14 20:49:27
nit: no need for {}
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 115 break; | |
| 116 } | |
| 117 pool.push_back(socket); | |
| 118 } | |
| 119 } | |
| 120 } | |
| 121 | |
| 122 scoped_ptr<DatagramClientSocket> DefaultDnsSocketPool::AllocateSocket( | |
| 123 unsigned server_index) { | |
| 124 CHECK(server_index < pools_.size()); | |
| 
 
szym
2012/09/14 20:49:27
DCHECK_LT
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 125 std::vector<DatagramClientSocket*>& pool = pools_[server_index]; | |
| 126 | |
| 127 // allocate one extra socket, since we're about to remove one | |
| 
 
szym
2012/09/14 20:49:27
You say "one extra" but this is a loop.
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
The comment is to explain "kAllocateMinSize + 1".
 
 | |
| 128 while (pool.size() < kAllocateMinSize + 1) { | |
| 129 DatagramClientSocket* socket = | |
| 130 CreateConnectedSocket(server_index).release(); | |
| 131 if (!socket) { | |
| 
 
szym
2012/09/14 20:49:27
nit: no need for {}
 
Deprecated (see juliatuttle)
2012/09/26 20:44:50
Done.
 
 | |
| 132 break; | |
| 133 } | |
| 134 pool.push_back(socket); | |
| 135 } | |
| 136 | |
| 137 if (pool.size() < kAllocateMinSize) { | |
| 138 LOG(WARNING) << "Low DNS port entropy: " << "wanted " << kAllocateMinSize | |
| 
 
szym
2012/09/14 20:49:27
nit: no need for the second <<
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 139 << " sockets to choose from, but only have " << pool.size(); | |
| 140 } | |
| 141 | |
| 142 unsigned socket_index = base::RandInt(0, pool.size() - 1); | |
| 143 DatagramClientSocket* socket = pool[socket_index]; | |
| 144 pool[socket_index] = pool.back(); | |
| 145 pool.pop_back(); | |
| 146 | |
| 147 return scoped_ptr<DatagramClientSocket>(socket); | |
| 148 } | |
| 149 | |
| 150 void DefaultDnsSocketPool::FreeSocket( | |
| 151 unsigned server_index, | |
| 152 scoped_ptr<DatagramClientSocket> socket) { | |
| 153 CHECK(server_index < pools_.size()); | |
| 
 
szym
2012/09/14 20:49:27
DCHECK_LT
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 154 std::vector<DatagramClientSocket*>& pool = pools_[server_index]; | |
| 155 | |
| 156 if (pool.size() < kRetainMaxSize) { | |
| 
 
szym
2012/09/14 20:49:27
nit: no need for {}
 
Deprecated (see juliatuttle)
2012/09/18 20:28:00
Done.
 
 | |
| 157 pool.push_back(socket.release()); | |
| 158 } | |
| 159 } | |
| 160 | |
| 161 } // namespace net | |
| OLD | NEW |