// 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 <vector> #include "base/memory/scoped_ptr.h" #include "net/base/net_export.h" #include "net/base/net_log.h" namespace net { class ClientSocketFactory; class DatagramClientSocket; class IPEndPoint; class NetLog; 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 scoped_ptr<DnsSocketPool> CreateDefault( ClientSocketFactory* factory); // 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 scoped_ptr<DnsSocketPool> CreateNull( ClientSocketFactory* factory); // 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 scoped_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 scoped_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, scoped_ptr<DatagramClientSocket> socket) = 0; // Creates a StreamSocket from the factory for a transaction over TCP. These // sockets are not pooled. scoped_ptr<StreamSocket> CreateTCPSocket( unsigned server_index, const NetLog::Source& source); protected: DnsSocketPool(ClientSocketFactory* socket_factory); void InitializeInternal( const std::vector<IPEndPoint>* nameservers, NetLog* net_log); scoped_ptr<DatagramClientSocket> CreateConnectedSocket( unsigned server_index); private: ClientSocketFactory* socket_factory_; NetLog* net_log_; const std::vector<IPEndPoint>* nameservers_; bool initialized_; DISALLOW_COPY_AND_ASSIGN(DnsSocketPool); }; } // namespace net #endif // NET_DNS_DNS_SOCKET_POOL_H_