summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/socket_stream/socket_stream.cc33
-rw-r--r--net/socket_stream/socket_stream.h9
-rw-r--r--net/socket_stream/socket_stream_unittest.cc36
-rw-r--r--net/websockets/websocket_job.cc27
-rw-r--r--net/websockets/websocket_job.h4
-rw-r--r--net/websockets/websocket_job_unittest.cc2
-rw-r--r--net/websockets/websocket_throttle_unittest.cc33
7 files changed, 78 insertions, 66 deletions
diff --git a/net/socket_stream/socket_stream.cc b/net/socket_stream/socket_stream.cc
index 254935a..e948570 100644
--- a/net/socket_stream/socket_stream.cc
+++ b/net/socket_stream/socket_stream.cc
@@ -10,6 +10,8 @@
#include <set>
#include <string>
+#include "base/bind.h"
+#include "base/bind_helpers.h"
#include "base/compiler_specific.h"
#include "base/logging.h"
#include "base/message_loop.h"
@@ -62,12 +64,17 @@ SocketStream::SocketStream(const GURL& url, Delegate* delegate)
proxy_mode_(kDirectConnection),
proxy_url_(url),
pac_request_(NULL),
+ // Unretained() is required; without it, Bind() creates a circular
+ // dependency and the SocketStream object will not be freed.
ALLOW_THIS_IN_INITIALIZER_LIST(
- io_callback_(this, &SocketStream::OnIOCompleted)),
+ io_callback_(base::Bind(&SocketStream::OnIOCompleted,
+ base::Unretained(this)))),
ALLOW_THIS_IN_INITIALIZER_LIST(
- read_callback_(this, &SocketStream::OnReadCompleted)),
+ io_callback_old_(this, &SocketStream::OnIOCompleted)),
ALLOW_THIS_IN_INITIALIZER_LIST(
- write_callback_(this, &SocketStream::OnWriteCompleted)),
+ read_callback_old_(this, &SocketStream::OnReadCompleted)),
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ write_callback_old_(this, &SocketStream::OnWriteCompleted)),
read_buf_(NULL),
write_buf_(NULL),
current_write_buf_(NULL),
@@ -548,7 +555,7 @@ int SocketStream::DoResolveProxy() {
// Alternate-Protocol header here for ws:// or TLS NPN extension for wss:// .
return proxy_service()->ResolveProxy(
- proxy_url_, &proxy_info_, &io_callback_, &pac_request_, net_log_);
+ proxy_url_, &proxy_info_, &io_callback_old_, &pac_request_, net_log_);
}
int SocketStream::DoResolveProxyComplete(int result) {
@@ -625,7 +632,7 @@ int SocketStream::DoResolveHostComplete(int result) {
int SocketStream::DoResolveProtocol(int result) {
DCHECK_EQ(OK, result);
next_state_ = STATE_RESOLVE_PROTOCOL_COMPLETE;
- result = delegate_->OnStartOpenConnection(this, &io_callback_);
+ result = delegate_->OnStartOpenConnection(this, io_callback_);
if (result == ERR_IO_PENDING)
metrics_->OnWaitConnection();
else if (result != OK && result != ERR_PROTOCOL_SWITCHED)
@@ -661,7 +668,7 @@ int SocketStream::DoTcpConnect(int result) {
net_log_.net_log(),
net_log_.source()));
metrics_->OnStartConnection();
- return socket_->Connect(&io_callback_);
+ return socket_->Connect(&io_callback_old_);
}
int SocketStream::DoTcpConnectComplete(int result) {
@@ -754,7 +761,7 @@ int SocketStream::DoWriteTunnelHeaders() {
int buf_len = static_cast<int>(tunnel_request_headers_->headers_.size() -
tunnel_request_headers_bytes_sent_);
DCHECK_GT(buf_len, 0);
- return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_);
+ return socket_->Write(tunnel_request_headers_, buf_len, &io_callback_old_);
}
int SocketStream::DoWriteTunnelHeadersComplete(int result) {
@@ -791,7 +798,7 @@ int SocketStream::DoReadTunnelHeaders() {
tunnel_response_headers_->SetDataOffset(tunnel_response_headers_len_);
CHECK(tunnel_response_headers_->data());
- return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_);
+ return socket_->Read(tunnel_response_headers_, buf_len, &io_callback_old_);
}
int SocketStream::DoReadTunnelHeadersComplete(int result) {
@@ -888,7 +895,7 @@ int SocketStream::DoSOCKSConnect() {
s = new SOCKSClientSocket(s, req_info, host_resolver_);
socket_.reset(s);
metrics_->OnCountConnectionType(SocketStreamMetrics::SOCKS_CONNECTION);
- return socket_->Connect(&io_callback_);
+ return socket_->Connect(&io_callback_old_);
}
int SocketStream::DoSOCKSConnectComplete(int result) {
@@ -919,7 +926,7 @@ int SocketStream::DoSecureProxyConnect() {
ssl_context));
next_state_ = STATE_SECURE_PROXY_CONNECT_COMPLETE;
metrics_->OnCountConnectionType(SocketStreamMetrics::SECURE_PROXY_CONNECTION);
- return socket_->Connect(&io_callback_);
+ return socket_->Connect(&io_callback_old_);
}
int SocketStream::DoSecureProxyConnectComplete(int result) {
@@ -949,7 +956,7 @@ int SocketStream::DoSSLConnect() {
ssl_context));
next_state_ = STATE_SSL_CONNECT_COMPLETE;
metrics_->OnCountConnectionType(SocketStreamMetrics::SSL_CONNECTION);
- return socket_->Connect(&io_callback_);
+ return socket_->Connect(&io_callback_old_);
}
int SocketStream::DoSSLConnectComplete(int result) {
@@ -994,7 +1001,7 @@ int SocketStream::DoReadWrite(int result) {
if (!read_buf_) {
// No read pending and server didn't close the socket.
read_buf_ = new IOBuffer(kReadBufferSize);
- result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_);
+ result = socket_->Read(read_buf_, kReadBufferSize, &read_callback_old_);
if (result > 0) {
return DidReceiveData(result);
} else if (result == 0) {
@@ -1022,7 +1029,7 @@ int SocketStream::DoReadWrite(int result) {
current_write_buf_->SetOffset(write_buf_offset_);
result = socket_->Write(current_write_buf_,
current_write_buf_->BytesRemaining(),
- &write_callback_);
+ &write_callback_old_);
if (result > 0) {
return DidSendData(result);
}
diff --git a/net/socket_stream/socket_stream.h b/net/socket_stream/socket_stream.h
index 9539ca6..501c44b 100644
--- a/net/socket_stream/socket_stream.h
+++ b/net/socket_stream/socket_stream.h
@@ -62,7 +62,7 @@ class NET_EXPORT SocketStream
virtual ~Delegate() {}
virtual int OnStartOpenConnection(SocketStream* socket,
- OldCompletionCallback* callback) {
+ const CompletionCallback& callback) {
return OK;
}
@@ -336,9 +336,10 @@ class NET_EXPORT SocketStream
SSLConfig server_ssl_config_;
SSLConfig proxy_ssl_config_;
- OldCompletionCallbackImpl<SocketStream> io_callback_;
- OldCompletionCallbackImpl<SocketStream> read_callback_;
- OldCompletionCallbackImpl<SocketStream> write_callback_;
+ const CompletionCallback io_callback_;
+ OldCompletionCallbackImpl<SocketStream> io_callback_old_;
+ OldCompletionCallbackImpl<SocketStream> read_callback_old_;
+ OldCompletionCallbackImpl<SocketStream> write_callback_old_;
scoped_refptr<IOBuffer> read_buf_;
int read_buf_size_;
diff --git a/net/socket_stream/socket_stream_unittest.cc b/net/socket_stream/socket_stream_unittest.cc
index 3732498..dac85bc 100644
--- a/net/socket_stream/socket_stream_unittest.cc
+++ b/net/socket_stream/socket_stream_unittest.cc
@@ -32,7 +32,6 @@ struct SocketStreamEvent {
int num,
const std::string& str,
net::AuthChallengeInfo* auth_challenge_info,
- net::OldCompletionCallback* callback,
int error)
: event_type(type), socket(socket_stream), number(num), data(str),
auth_info(auth_challenge_info), error_code(error) {}
@@ -78,62 +77,63 @@ class SocketStreamEventRecorder : public net::SocketStream::Delegate {
on_error_ = callback;
}
- virtual int OnStartOpenConnection(net::SocketStream* socket,
- net::OldCompletionCallback* callback) {
+ virtual int OnStartOpenConnection(
+ net::SocketStream* socket,
+ const net::CompletionCallback& callback) OVERRIDE {
connection_callback_ = callback;
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_START_OPEN_CONNECTION,
- socket, 0, std::string(), NULL, callback, net::OK));
+ socket, 0, std::string(), NULL, net::OK));
if (!on_start_open_connection_.is_null())
return on_start_open_connection_.Run(&events_.back());
return net::OK;
}
virtual void OnConnected(net::SocketStream* socket,
- int num_pending_send_allowed) {
+ int num_pending_send_allowed) OVERRIDE {
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_CONNECTED,
socket, num_pending_send_allowed, std::string(),
- NULL, NULL, net::OK));
+ NULL, net::OK));
if (!on_connected_.is_null())
on_connected_.Run(&events_.back());
}
virtual void OnSentData(net::SocketStream* socket,
- int amount_sent) {
+ int amount_sent) OVERRIDE {
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_SENT_DATA, socket,
- amount_sent, std::string(), NULL, NULL, net::OK));
+ amount_sent, std::string(), NULL, net::OK));
if (!on_sent_data_.is_null())
on_sent_data_.Run(&events_.back());
}
virtual void OnReceivedData(net::SocketStream* socket,
- const char* data, int len) {
+ const char* data, int len) OVERRIDE {
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_RECEIVED_DATA, socket, len,
- std::string(data, len), NULL, NULL, net::OK));
+ std::string(data, len), NULL, net::OK));
if (!on_received_data_.is_null())
on_received_data_.Run(&events_.back());
}
- virtual void OnClose(net::SocketStream* socket) {
+ virtual void OnClose(net::SocketStream* socket) OVERRIDE {
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_CLOSE, socket, 0,
- std::string(), NULL, NULL, net::OK));
+ std::string(), NULL, net::OK));
if (!on_close_.is_null())
on_close_.Run(&events_.back());
if (callback_)
callback_->Run(net::OK);
}
virtual void OnAuthRequired(net::SocketStream* socket,
- net::AuthChallengeInfo* auth_info) {
+ net::AuthChallengeInfo* auth_info) OVERRIDE {
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_AUTH_REQUIRED, socket, 0,
- std::string(), auth_info, NULL, net::OK));
+ std::string(), auth_info, net::OK));
if (!on_auth_required_.is_null())
on_auth_required_.Run(&events_.back());
}
- virtual void OnError(const net::SocketStream* socket, int error) {
+ virtual void OnError(const net::SocketStream* socket, int error) OVERRIDE {
events_.push_back(
SocketStreamEvent(SocketStreamEvent::EVENT_ERROR, NULL, 0,
- std::string(), NULL, NULL, error));
+ std::string(), NULL, error));
if (!on_error_.is_null())
on_error_.Run(&events_.back());
if (callback_)
@@ -152,7 +152,7 @@ class SocketStreamEventRecorder : public net::SocketStream::Delegate {
credentials_ = credentials;
}
void CompleteConnection(int result) {
- connection_callback_->Run(result);
+ connection_callback_.Run(result);
}
const std::vector<SocketStreamEvent>& GetSeenEvents() const {
@@ -169,7 +169,7 @@ class SocketStreamEventRecorder : public net::SocketStream::Delegate {
base::Callback<void(SocketStreamEvent*)> on_auth_required_;
base::Callback<void(SocketStreamEvent*)> on_error_;
net::OldCompletionCallback* callback_;
- net::OldCompletionCallback* connection_callback_;
+ net::CompletionCallback connection_callback_;
net::AuthCredentials credentials_;
DISALLOW_COPY_AND_ASSIGN(SocketStreamEventRecorder);
diff --git a/net/websockets/websocket_job.cc b/net/websockets/websocket_job.cc
index 794586b..03ca0da 100644
--- a/net/websockets/websocket_job.cc
+++ b/net/websockets/websocket_job.cc
@@ -76,7 +76,6 @@ WebSocketJob::WebSocketJob(SocketStream::Delegate* delegate)
: delegate_(delegate),
state_(INITIALIZED),
waiting_(false),
- callback_(NULL),
handshake_request_(new WebSocketHandshakeRequestHandler),
handshake_response_(new WebSocketHandshakeResponseHandler),
started_to_send_handshake_request_(false),
@@ -173,16 +172,16 @@ void WebSocketJob::DetachDelegate() {
if (socket_)
socket_->DetachDelegate();
socket_ = NULL;
- if (callback_) {
+ if (!callback_.is_null()) {
waiting_ = false;
- callback_ = NULL;
+ callback_.Reset();
Release(); // Balanced with OnStartOpenConnection().
}
}
int WebSocketJob::OnStartOpenConnection(
- SocketStream* socket, OldCompletionCallback* callback) {
- DCHECK(!callback_);
+ SocketStream* socket, const CompletionCallback& callback) {
+ DCHECK(callback_.is_null());
state_ = CONNECTING;
addresses_ = socket->address_list();
WebSocketThrottle::GetInstance()->PutInQueue(this);
@@ -194,7 +193,7 @@ int WebSocketJob::OnStartOpenConnection(
// PutInQueue() may set |waiting_| true for throttling. In this case,
// Wakeup() will be called later.
callback_ = callback;
- AddRef(); // Balanced when callback_ becomes NULL.
+ AddRef(); // Balanced when callback_ is cleared.
return ERR_IO_PENDING;
}
return TrySpdyStream();
@@ -280,9 +279,9 @@ void WebSocketJob::OnClose(SocketStream* socket) {
SocketStream::Delegate* delegate = delegate_;
delegate_ = NULL;
socket_ = NULL;
- if (callback_) {
+ if (!callback_.is_null()) {
waiting_ = false;
- callback_ = NULL;
+ callback_.Reset();
Release(); // Balanced with OnStartOpenConnection().
}
if (delegate)
@@ -615,7 +614,7 @@ void WebSocketJob::Wakeup() {
if (!waiting_)
return;
waiting_ = false;
- DCHECK(callback_);
+ DCHECK(!callback_.is_null());
MessageLoopForIO::current()->PostTask(
FROM_HERE,
base::Bind(&WebSocketJob::RetryPendingIO,
@@ -632,11 +631,11 @@ void WebSocketJob::RetryPendingIO() {
}
void WebSocketJob::CompleteIO(int result) {
- // |callback_| may be NULL if OnClose() or DetachDelegate() was called.
- if (callback_) {
- net::OldCompletionCallback* callback = callback_;
- callback_ = NULL;
- callback->Run(result);
+ // |callback_| may be null if OnClose() or DetachDelegate() was called.
+ if (!callback_.is_null()) {
+ CompletionCallback callback = callback_;
+ callback_.Reset();
+ callback.Run(result);
Release(); // Balanced with OnStartOpenConnection().
}
}
diff --git a/net/websockets/websocket_job.h b/net/websockets/websocket_job.h
index 1fcf256..61b1d8d 100644
--- a/net/websockets/websocket_job.h
+++ b/net/websockets/websocket_job.h
@@ -61,7 +61,7 @@ class NET_EXPORT WebSocketJob
// SocketStream::Delegate methods.
virtual int OnStartOpenConnection(
- SocketStream* socket, OldCompletionCallback* callback) OVERRIDE;
+ SocketStream* socket, const CompletionCallback& callback) OVERRIDE;
virtual void OnConnected(SocketStream* socket,
int max_pending_send_allowed) OVERRIDE;
virtual void OnSentData(SocketStream* socket, int amount_sent) OVERRIDE;
@@ -119,7 +119,7 @@ class NET_EXPORT WebSocketJob
State state_;
bool waiting_;
AddressList addresses_;
- OldCompletionCallback* callback_; // for throttling.
+ CompletionCallback callback_; // for throttling.
scoped_ptr<WebSocketHandshakeRequestHandler> handshake_request_;
scoped_ptr<WebSocketHandshakeResponseHandler> handshake_response_;
diff --git a/net/websockets/websocket_job_unittest.cc b/net/websockets/websocket_job_unittest.cc
index db3add1..ac67ffd 100644
--- a/net/websockets/websocket_job_unittest.cc
+++ b/net/websockets/websocket_job_unittest.cc
@@ -93,7 +93,7 @@ class MockSocketStreamDelegate : public net::SocketStream::Delegate {
}
virtual int OnStartOpenConnection(net::SocketStream* socket,
- net::OldCompletionCallback* callback) {
+ const net::CompletionCallback& callback) {
if (!on_start_open_connection_.is_null())
on_start_open_connection_.Run();
return net::OK;
diff --git a/net/websockets/websocket_throttle_unittest.cc b/net/websockets/websocket_throttle_unittest.cc
index 909dcf9..4044044 100644
--- a/net/websockets/websocket_throttle_unittest.cc
+++ b/net/websockets/websocket_throttle_unittest.cc
@@ -100,9 +100,9 @@ TEST_F(WebSocketThrottleTest, Throttle) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket1";
- TestOldCompletionCallback callback_s1;
+ TestCompletionCallback callback_s1;
// Trying to open connection to host1 will start without wait.
- EXPECT_EQ(OK, w1->OnStartOpenConnection(s1, &callback_s1));
+ EXPECT_EQ(OK, w1->OnStartOpenConnection(s1, callback_s1.callback()));
// Now connecting to host1, so waiting queue looks like
// Address | head -> tail
@@ -121,9 +121,10 @@ TEST_F(WebSocketThrottleTest, Throttle) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket2";
- TestOldCompletionCallback callback_s2;
+ TestCompletionCallback callback_s2;
// Trying to open connection to host2 will wait for w1.
- EXPECT_EQ(ERR_IO_PENDING, w2->OnStartOpenConnection(s2, &callback_s2));
+ EXPECT_EQ(ERR_IO_PENDING,
+ w2->OnStartOpenConnection(s2, callback_s2.callback()));
// Now waiting queue looks like
// Address | head -> tail
// 1.2.3.4 | w1 w2
@@ -141,9 +142,10 @@ TEST_F(WebSocketThrottleTest, Throttle) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket3";
- TestOldCompletionCallback callback_s3;
+ TestCompletionCallback callback_s3;
// Trying to open connection to host3 will wait for w1.
- EXPECT_EQ(ERR_IO_PENDING, w3->OnStartOpenConnection(s3, &callback_s3));
+ EXPECT_EQ(ERR_IO_PENDING,
+ w3->OnStartOpenConnection(s3, callback_s3.callback()));
// Address | head -> tail
// 1.2.3.4 | w1 w2
// 1.2.3.5 | w1 w3
@@ -161,9 +163,10 @@ TEST_F(WebSocketThrottleTest, Throttle) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket4";
- TestOldCompletionCallback callback_s4;
+ TestCompletionCallback callback_s4;
// Trying to open connection to host4 will wait for w1, w2.
- EXPECT_EQ(ERR_IO_PENDING, w4->OnStartOpenConnection(s4, &callback_s4));
+ EXPECT_EQ(ERR_IO_PENDING,
+ w4->OnStartOpenConnection(s4, callback_s4.callback()));
// Address | head -> tail
// 1.2.3.4 | w1 w2 w4
// 1.2.3.5 | w1 w3
@@ -180,9 +183,10 @@ TEST_F(WebSocketThrottleTest, Throttle) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket5";
- TestOldCompletionCallback callback_s5;
+ TestCompletionCallback callback_s5;
// Trying to open connection to host5 will wait for w1, w4
- EXPECT_EQ(ERR_IO_PENDING, w5->OnStartOpenConnection(s5, &callback_s5));
+ EXPECT_EQ(ERR_IO_PENDING,
+ w5->OnStartOpenConnection(s5, callback_s5.callback()));
// Address | head -> tail
// 1.2.3.4 | w1 w2 w4
// 1.2.3.5 | w1 w3
@@ -199,9 +203,10 @@ TEST_F(WebSocketThrottleTest, Throttle) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket6";
- TestOldCompletionCallback callback_s6;
+ TestCompletionCallback callback_s6;
// Trying to open connection to host6 will wait for w1, w4, w5
- EXPECT_EQ(ERR_IO_PENDING, w6->OnStartOpenConnection(s6, &callback_s6));
+ EXPECT_EQ(ERR_IO_PENDING,
+ w6->OnStartOpenConnection(s6, callback_s6.callback()));
// Address | head -> tail
// 1.2.3.4 | w1 w2 w4
// 1.2.3.5 | w1 w3
@@ -311,9 +316,9 @@ TEST_F(WebSocketThrottleTest, NoThrottleForDuplicateAddress) {
DeleteAddrInfo(addr);
DVLOG(1) << "socket1";
- TestOldCompletionCallback callback_s1;
+ TestCompletionCallback callback_s1;
// Trying to open connection to localhost will start without wait.
- EXPECT_EQ(OK, w1->OnStartOpenConnection(s1, &callback_s1));
+ EXPECT_EQ(OK, w1->OnStartOpenConnection(s1, callback_s1.callback()));
DVLOG(1) << "socket1 close";
w1->OnClose(s1.get());