diff options
-rw-r--r-- | net/socket_stream/socket_stream.cc | 33 | ||||
-rw-r--r-- | net/socket_stream/socket_stream.h | 9 | ||||
-rw-r--r-- | net/socket_stream/socket_stream_unittest.cc | 36 | ||||
-rw-r--r-- | net/websockets/websocket_job.cc | 27 | ||||
-rw-r--r-- | net/websockets/websocket_job.h | 4 | ||||
-rw-r--r-- | net/websockets/websocket_job_unittest.cc | 2 | ||||
-rw-r--r-- | net/websockets/websocket_throttle_unittest.cc | 33 |
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()); |