diff options
author | wtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-17 18:55:26 +0000 |
---|---|---|
committer | wtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-17 18:55:26 +0000 |
commit | 443844f33b9764dd1cd62087d30d5f2b19a577a8 (patch) | |
tree | a4d14be9a48cd7b880ef1a9ea68983a08d9dcfd4 | |
parent | 09ddb094420f2de629fa6a06684cf59ef9b51092 (diff) | |
download | chromium_src-443844f33b9764dd1cd62087d30d5f2b19a577a8.zip chromium_src-443844f33b9764dd1cd62087d30d5f2b19a577a8.tar.gz chromium_src-443844f33b9764dd1cd62087d30d5f2b19a577a8.tar.bz2 |
Merge 277158 "Cancel posted write callbacks in Disconnect()."
> Cancel posted write callbacks in Disconnect().
>
> Add a second WeakPtrFactory for the posted write callbacks. Invalidate
> the weak pointers created by this factory in Disconnect().
>
> R=jgraettinger@chromium.org,rch@chromium.org,rsleevi@chromium.org
> BUG=362733
>
> Review URL: https://codereview.chromium.org/338583003
TBR=wtc@chromium.org
Review URL: https://codereview.chromium.org/332043003
git-svn-id: svn://svn.chromium.org/chrome/branches/1985/src@277827 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/spdy/spdy_proxy_client_socket.cc | 21 | ||||
-rw-r--r-- | net/spdy/spdy_proxy_client_socket.h | 9 |
2 files changed, 24 insertions, 6 deletions
diff --git a/net/spdy/spdy_proxy_client_socket.cc b/net/spdy/spdy_proxy_client_socket.cc index 74e6d74..23d26ba 100644 --- a/net/spdy/spdy_proxy_client_socket.cc +++ b/net/spdy/spdy_proxy_client_socket.cc @@ -36,16 +36,16 @@ SpdyProxyClientSocket::SpdyProxyClientSocket( : next_state_(STATE_DISCONNECTED), spdy_stream_(spdy_stream), endpoint_(endpoint), - auth_( - new HttpAuthController(HttpAuth::AUTH_PROXY, - GURL("https://" + proxy_server.ToString()), - auth_cache, - auth_handler_factory)), + auth_(new HttpAuthController(HttpAuth::AUTH_PROXY, + GURL("https://" + proxy_server.ToString()), + auth_cache, + auth_handler_factory)), user_buffer_len_(0), write_buffer_len_(0), was_ever_used_(false), redirect_has_load_timing_info_(false), weak_factory_(this), + write_callback_weak_factory_(this), net_log_(BoundNetLog::Make(spdy_stream->net_log().net_log(), NetLog::SOURCE_PROXY_CLIENT_SOCKET)) { request_.method = "CONNECT"; @@ -137,6 +137,7 @@ void SpdyProxyClientSocket::Disconnect() { write_buffer_len_ = 0; write_callback_.Reset(); + write_callback_weak_factory_.InvalidateWeakPtrs(); next_state_ = STATE_DISCONNECTED; @@ -268,6 +269,11 @@ void SpdyProxyClientSocket::LogBlockedTunnelResponse() const { /* is_https_proxy = */ true); } +void SpdyProxyClientSocket::RunCallback(const CompletionCallback& callback, + int result) const { + callback.Run(result); +} + void SpdyProxyClientSocket::OnIOComplete(int result) { DCHECK_NE(STATE_DISCONNECTED, next_state_); int rv = DoLoop(result); @@ -487,7 +493,10 @@ void SpdyProxyClientSocket::OnDataSent() { // stream's write callback chain to unwind (see crbug.com/355511). base::MessageLoop::current()->PostTask( FROM_HERE, - base::Bind(ResetAndReturn(&write_callback_), rv)); + base::Bind(&SpdyProxyClientSocket::RunCallback, + write_callback_weak_factory_.GetWeakPtr(), + ResetAndReturn(&write_callback_), + rv)); } void SpdyProxyClientSocket::OnClose(int status) { diff --git a/net/spdy/spdy_proxy_client_socket.h b/net/spdy/spdy_proxy_client_socket.h index 4c4e8fd..52858cb 100644 --- a/net/spdy/spdy_proxy_client_socket.h +++ b/net/spdy/spdy_proxy_client_socket.h @@ -113,6 +113,10 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket, void LogBlockedTunnelResponse() const; + // Calls |callback.Run(result)|. Used to run a callback posted to the + // message loop. + void RunCallback(const CompletionCallback& callback, int result) const; + void OnIOComplete(int result); int DoLoop(int last_io_result); @@ -163,8 +167,13 @@ class NET_EXPORT_PRIVATE SpdyProxyClientSocket : public ProxyClientSocket, bool redirect_has_load_timing_info_; LoadTimingInfo redirect_load_timing_info_; + // The default weak pointer factory. base::WeakPtrFactory<SpdyProxyClientSocket> weak_factory_; + // Only used for posting write callbacks. Weak pointers created by this + // factory are invalidated in Disconnect(). + base::WeakPtrFactory<SpdyProxyClientSocket> write_callback_weak_factory_; + const BoundNetLog net_log_; DISALLOW_COPY_AND_ASSIGN(SpdyProxyClientSocket); |