blob: f4f00bba6e4480f06ecaef3e6f03c83aba9821a9 [file] [log] [blame]
// 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_