| // Copyright (c) 2012 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. | |
| #ifndef NET_DNS_DNS_SOCKET_POOL_H_ | |
| #define NET_DNS_DNS_SOCKET_POOL_H_ | |
| #include <memory> | |
| #include <vector> | |
| #include "base/macros.h" | |
| #include "net/base/net_export.h" | |
| #include "net/base/rand_callback.h" | |
| namespace net { | |
| class ClientSocketFactory; | |
| class DatagramClientSocket; | |
| class IPEndPoint; | |
| class NetLog; | |
| struct NetLogSource; | |
| class StreamSocket; | |
| // A DnsSocketPool is an abstraction layer around a ClientSocketFactory that | |
| // allows preallocation, reuse, or other strategies to manage sockets connected | |
| // to DNS servers. | |
| class NET_EXPORT_PRIVATE DnsSocketPool { | |
| public: | |
| virtual ~DnsSocketPool(); | |
| // Creates a DnsSocketPool that implements the default strategy for managing | |
| // sockets. (This varies by platform; see DnsSocketPoolImpl in | |
| // dns_socket_pool.cc for details.) | |
| static std::unique_ptr<DnsSocketPool> CreateDefault( | |
| ClientSocketFactory* factory, | |
| const RandIntCallback& rand_int_callback); | |
| // Creates a DnsSocketPool that implements a "null" strategy -- no sockets are | |
| // preallocated, allocation requests are satisfied by calling the factory | |
| // directly, and returned sockets are deleted immediately. | |
| static std::unique_ptr<DnsSocketPool> CreateNull( | |
| ClientSocketFactory* factory, | |
| const RandIntCallback& rand_int_callback); | |
| // Initializes the DnsSocketPool. |nameservers| is the list of nameservers | |
| // for which the DnsSocketPool will manage sockets; |net_log| is the NetLog | |
| // used when constructing sockets with the factory. | |
| // | |
| // Initialize may not be called more than once, and must be called before | |
| // calling AllocateSocket or FreeSocket. | |
| virtual void Initialize( | |
| const std::vector<IPEndPoint>* nameservers, | |
| NetLog* net_log) = 0; | |
| // Allocates a socket that is already connected to the nameserver referenced | |
| // by |server_index|. May return a std::unique_ptr to NULL if no sockets are | |
| // available to reuse and the factory fails to produce a socket (or produces | |
| // one on which Connect fails). | |
| virtual std::unique_ptr<DatagramClientSocket> AllocateSocket( | |
| unsigned server_index) = 0; | |
| // Frees a socket allocated by AllocateSocket. |server_index| must be the | |
| // same index passed to AllocateSocket. | |
| virtual void FreeSocket(unsigned server_index, | |
| std::unique_ptr<DatagramClientSocket> socket) = 0; | |
| // Creates a StreamSocket from the factory for a transaction over TCP. These | |
| // sockets are not pooled. | |
| std::unique_ptr<StreamSocket> CreateTCPSocket(unsigned server_index, | |
| const NetLogSource& source); | |
| protected: | |
| DnsSocketPool(ClientSocketFactory* socket_factory, | |
| const RandIntCallback& rand_int_callback); | |
| void InitializeInternal( | |
| const std::vector<IPEndPoint>* nameservers, | |
| NetLog* net_log); | |
| std::unique_ptr<DatagramClientSocket> CreateConnectedSocket( | |
| unsigned server_index); | |
| // Returns a random int in the specified range. | |
| int GetRandomInt(int min, int max); | |
| private: | |
| ClientSocketFactory* socket_factory_; | |
| const RandIntCallback rand_int_callback_; | |
| NetLog* net_log_; | |
| const std::vector<IPEndPoint>* nameservers_; | |
| bool initialized_; | |
| DISALLOW_COPY_AND_ASSIGN(DnsSocketPool); | |
| }; | |
| } // namespace net | |
| #endif // NET_DNS_DNS_SOCKET_POOL_H_ |