Skip to content

Commit

Permalink
Create WebSocketTransportClientSocketPool
Browse files Browse the repository at this point in the history
It is a variant of TransportClientSocketPool that performs RFC6455-style
connection throttling.

Design doc: https://docs.google.com/a/chromium.org/document/d/1a8sUFQsbN5uve7ziW61ATkrFr3o9A-Tiyw8ig6T3puA/edit

BUG=343107

Review URL: https://codereview.chromium.org/240873003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@279524 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
ricea@chromium.org committed Jun 24, 2014
1 parent f3ba291 commit 6548661
Show file tree
Hide file tree
Showing 21 changed files with 3,575 additions and 631 deletions.
14 changes: 13 additions & 1 deletion base/containers/linked_list.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#ifndef BASE_CONTAINERS_LINKED_LIST_H_
#define BASE_CONTAINERS_LINKED_LIST_H_

#include "base/macros.h"

// Simple LinkedList type. (See the Q&A section to understand how this
// differs from std::list).
//
Expand Down Expand Up @@ -82,7 +84,7 @@ namespace base {
template <typename T>
class LinkNode {
public:
LinkNode() : previous_(0), next_(0) {}
LinkNode() : previous_(NULL), next_(NULL) {}
LinkNode(LinkNode<T>* previous, LinkNode<T>* next)
: previous_(previous), next_(next) {}

Expand All @@ -106,6 +108,10 @@ class LinkNode {
void RemoveFromList() {
this->previous_->next_ = this->next_;
this->next_->previous_ = this->previous_;
// next() and previous() return non-NULL if and only this node is not in any
// list.
this->next_ = NULL;
this->previous_ = NULL;
}

LinkNode<T>* previous() const {
Expand All @@ -128,6 +134,8 @@ class LinkNode {
private:
LinkNode<T>* previous_;
LinkNode<T>* next_;

DISALLOW_COPY_AND_ASSIGN(LinkNode);
};

template <typename T>
Expand Down Expand Up @@ -155,8 +163,12 @@ class LinkedList {
return &root_;
}

bool empty() const { return head() == end(); }

private:
LinkNode<T> root_;

DISALLOW_COPY_AND_ASSIGN(LinkedList);
};

} // namespace base
Expand Down
47 changes: 47 additions & 0 deletions base/containers/linked_list_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -257,5 +257,52 @@ TEST(LinkedList, MultipleInheritanceNode) {
EXPECT_EQ(&node, node.value());
}

TEST(LinkedList, EmptyListIsEmpty) {
LinkedList<Node> list;
EXPECT_TRUE(list.empty());
}

TEST(LinkedList, NonEmptyListIsNotEmpty) {
LinkedList<Node> list;

Node n(1);
list.Append(&n);

EXPECT_FALSE(list.empty());
}

TEST(LinkedList, EmptiedListIsEmptyAgain) {
LinkedList<Node> list;

Node n(1);
list.Append(&n);
n.RemoveFromList();

EXPECT_TRUE(list.empty());
}

TEST(LinkedList, NodesCanBeReused) {
LinkedList<Node> list1;
LinkedList<Node> list2;

Node n(1);
list1.Append(&n);
n.RemoveFromList();
list2.Append(&n);

EXPECT_EQ(list2.head()->value(), &n);
}

TEST(LinkedList, RemovedNodeHasNullNextPrevious) {
LinkedList<Node> list;

Node n(1);
list.Append(&n);
n.RemoveFromList();

EXPECT_EQ(NULL, n.next());
EXPECT_EQ(NULL, n.previous());
}

} // namespace
} // namespace base
9 changes: 0 additions & 9 deletions net/http/http_stream_factory_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -945,9 +945,6 @@ TEST_P(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStream) {
session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL)));
EXPECT_EQ(0, GetSocketPoolGroupCount(
session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL)));
EXPECT_EQ(1, GetSocketPoolGroupCount(
session->GetTransportSocketPool(
HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
EXPECT_EQ(0, GetSocketPoolGroupCount(
session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
EXPECT_TRUE(waiter.used_proxy_info().is_direct());
Expand Down Expand Up @@ -996,9 +993,6 @@ TEST_P(HttpStreamFactoryTest, RequestWebSocketBasicHandshakeStreamOverSSL) {
session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL)));
EXPECT_EQ(0, GetSocketPoolGroupCount(
session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL)));
EXPECT_EQ(1, GetSocketPoolGroupCount(
session->GetTransportSocketPool(
HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
EXPECT_EQ(1, GetSocketPoolGroupCount(
session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
EXPECT_TRUE(waiter.used_proxy_info().is_direct());
Expand Down Expand Up @@ -1161,9 +1155,6 @@ TEST_P(HttpStreamFactoryTest, RequestWebSocketSpdyHandshakeStreamButGetSSL) {
session->GetTransportSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL)));
EXPECT_EQ(0, GetSocketPoolGroupCount(
session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL)));
EXPECT_EQ(1, GetSocketPoolGroupCount(
session->GetTransportSocketPool(
HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
EXPECT_EQ(1, GetSocketPoolGroupCount(
session->GetSSLSocketPool(HttpNetworkSession::WEBSOCKET_SOCKET_POOL)));
EXPECT_TRUE(waiter1.used_proxy_info().is_direct());
Expand Down
10 changes: 10 additions & 0 deletions net/net.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -979,6 +979,12 @@
'socket/transport_client_socket_pool.h',
'socket/unix_domain_socket_posix.cc',
'socket/unix_domain_socket_posix.h',
'socket/websocket_endpoint_lock_manager.cc',
'socket/websocket_endpoint_lock_manager.h',
'socket/websocket_transport_client_socket_pool.cc',
'socket/websocket_transport_client_socket_pool.h',
'socket/websocket_transport_connect_sub_job.cc',
'socket/websocket_transport_connect_sub_job.h',
'socket_stream/socket_stream.cc',
'socket_stream/socket_stream.h',
'socket_stream/socket_stream_job.cc',
Expand Down Expand Up @@ -1557,9 +1563,13 @@
'socket/tcp_listen_socket_unittest.h',
'socket/tcp_server_socket_unittest.cc',
'socket/tcp_socket_unittest.cc',
'socket/transport_client_socket_pool_test_util.cc',
'socket/transport_client_socket_pool_test_util.h',
'socket/transport_client_socket_pool_unittest.cc',
'socket/transport_client_socket_unittest.cc',
'socket/unix_domain_socket_posix_unittest.cc',
'socket/websocket_endpoint_lock_manager_unittest.cc',
'socket/websocket_transport_client_socket_pool_unittest.cc',
'socket_stream/socket_stream_metrics_unittest.cc',
'socket_stream/socket_stream_unittest.cc',
'spdy/buffered_spdy_framer_unittest.cc',
Expand Down
22 changes: 16 additions & 6 deletions net/socket/client_socket_pool_manager_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "net/socket/socks_client_socket_pool.h"
#include "net/socket/ssl_client_socket_pool.h"
#include "net/socket/transport_client_socket_pool.h"
#include "net/socket/websocket_transport_client_socket_pool.h"
#include "net/ssl/ssl_config_service.h"

namespace net {
Expand Down Expand Up @@ -57,12 +58,21 @@ ClientSocketPoolManagerImpl::ClientSocketPoolManagerImpl(
ssl_config_service_(ssl_config_service),
pool_type_(pool_type),
transport_pool_histograms_("TCP"),
transport_socket_pool_(new TransportClientSocketPool(
max_sockets_per_pool(pool_type), max_sockets_per_group(pool_type),
&transport_pool_histograms_,
host_resolver,
socket_factory_,
net_log)),
transport_socket_pool_(
pool_type == HttpNetworkSession::WEBSOCKET_SOCKET_POOL
? new WebSocketTransportClientSocketPool(
max_sockets_per_pool(pool_type),
max_sockets_per_group(pool_type),
&transport_pool_histograms_,
host_resolver,
socket_factory_,
net_log)
: new TransportClientSocketPool(max_sockets_per_pool(pool_type),
max_sockets_per_group(pool_type),
&transport_pool_histograms_,
host_resolver,
socket_factory_,
net_log)),
ssl_pool_histograms_("SSL2"),
ssl_socket_pool_(new SSLClientSocketPool(
max_sockets_per_pool(pool_type), max_sockets_per_group(pool_type),
Expand Down
Loading

0 comments on commit 6548661

Please sign in to comment.