summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-17 18:55:26 +0000
committerwtc@chromium.org <wtc@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-17 18:55:26 +0000
commit443844f33b9764dd1cd62087d30d5f2b19a577a8 (patch)
treea4d14be9a48cd7b880ef1a9ea68983a08d9dcfd4
parent09ddb094420f2de629fa6a06684cf59ef9b51092 (diff)
downloadchromium_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.cc21
-rw-r--r--net/spdy/spdy_proxy_client_socket.h9
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);