Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: net/spdy/spdy_session.cc

Issue 8340012: Close idle connections / SPDY sessions when needed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: OVERRIDE Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/spdy/spdy_session.h" 5 #include "net/spdy/spdy_session.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/linked_ptr.h" 9 #include "base/memory/linked_ptr.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 324
325 net::Error SpdySession::InitializeWithSocket( 325 net::Error SpdySession::InitializeWithSocket(
326 ClientSocketHandle* connection, 326 ClientSocketHandle* connection,
327 bool is_secure, 327 bool is_secure,
328 int certificate_error_code) { 328 int certificate_error_code) {
329 base::StatsCounter spdy_sessions("spdy.sessions"); 329 base::StatsCounter spdy_sessions("spdy.sessions");
330 spdy_sessions.Increment(); 330 spdy_sessions.Increment();
331 331
332 state_ = CONNECTED; 332 state_ = CONNECTED;
333 connection_.reset(connection); 333 connection_.reset(connection);
334 connection_->AddLayeredPool(this);
334 is_secure_ = is_secure; 335 is_secure_ = is_secure;
335 certificate_error_code_ = certificate_error_code; 336 certificate_error_code_ = certificate_error_code;
336 337
337 // Write out any data that we might have to send, such as the settings frame. 338 // Write out any data that we might have to send, such as the settings frame.
338 WriteSocketLater(); 339 WriteSocketLater();
339 net::Error error = ReadSocket(); 340 net::Error error = ReadSocket();
340 if (error == ERR_IO_PENDING) 341 if (error == ERR_IO_PENDING)
341 return OK; 342 return OK;
342 return error; 343 return error;
343 } 344 }
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
960 return connection_->socket()->GetPeerAddress(address); 961 return connection_->socket()->GetPeerAddress(address);
961 } 962 }
962 963
963 int SpdySession::GetLocalAddress(IPEndPoint* address) const { 964 int SpdySession::GetLocalAddress(IPEndPoint* address) const {
964 if (!connection_->socket()) 965 if (!connection_->socket())
965 return ERR_SOCKET_NOT_CONNECTED; 966 return ERR_SOCKET_NOT_CONNECTED;
966 967
967 return connection_->socket()->GetLocalAddress(address); 968 return connection_->socket()->GetLocalAddress(address);
968 } 969 }
969 970
971 bool SpdySession::CloseOneIdleConnection() {
972 if (num_active_streams() == 0) {
973 // Should delete this.
974 RemoveFromPool();
mmenke 2011/10/27 18:52:37 Is this safe? It looks to me like there may be no
willchan no longer on Chromium 2011/11/08 22:26:13 I'm not sure I understand the worry. When we call
mmenke 2011/11/08 22:41:04 We don't dereference |this|, but RemoveFromPool do
willchan no longer on Chromium 2011/11/15 18:44:06 Again, great catch. I've fixed this.
975 return true;
976 }
977 return false;
978 }
979
970 void SpdySession::ActivateStream(SpdyStream* stream) { 980 void SpdySession::ActivateStream(SpdyStream* stream) {
971 const spdy::SpdyStreamId id = stream->stream_id(); 981 const spdy::SpdyStreamId id = stream->stream_id();
972 DCHECK(!IsStreamActive(id)); 982 DCHECK(!IsStreamActive(id));
973 983
974 active_streams_[id] = stream; 984 active_streams_[id] = stream;
975 } 985 }
976 986
977 void SpdySession::DeleteStream(spdy::SpdyStreamId id, int status) { 987 void SpdySession::DeleteStream(spdy::SpdyStreamId id, int status) {
978 // For push streams, if they are being deleted normally, we leave 988 // For push streams, if they are being deleted normally, we leave
979 // the stream in the unclaimed_pushed_streams_ list. However, if 989 // the stream in the unclaimed_pushed_streams_ list. However, if
(...skipping 14 matching lines...) Expand all
994 ActiveStreamMap::iterator it2 = active_streams_.find(id); 1004 ActiveStreamMap::iterator it2 = active_streams_.find(id);
995 if (it2 == active_streams_.end()) 1005 if (it2 == active_streams_.end())
996 return; 1006 return;
997 1007
998 // If this is an active stream, call the callback. 1008 // If this is an active stream, call the callback.
999 const scoped_refptr<SpdyStream> stream(it2->second); 1009 const scoped_refptr<SpdyStream> stream(it2->second);
1000 active_streams_.erase(it2); 1010 active_streams_.erase(it2);
1001 if (stream) 1011 if (stream)
1002 stream->OnClose(status); 1012 stream->OnClose(status);
1003 ProcessPendingCreateStreams(); 1013 ProcessPendingCreateStreams();
1014 if (num_active_streams() == 0 && connection_->IsPoolStalled()) {
1015 // Should delete this.
1016 RemoveFromPool();
1017 }
1004 } 1018 }
1005 1019
1006 void SpdySession::RemoveFromPool() { 1020 void SpdySession::RemoveFromPool() {
1007 if (spdy_session_pool_) { 1021 if (spdy_session_pool_) {
1008 spdy_session_pool_->Remove(make_scoped_refptr(this)); 1022 spdy_session_pool_->Remove(make_scoped_refptr(this));
1009 spdy_session_pool_ = NULL; 1023 spdy_session_pool_ = NULL;
1010 } 1024 }
1011 } 1025 }
1012 1026
1013 scoped_refptr<SpdyStream> SpdySession::GetActivePushStream( 1027 scoped_refptr<SpdyStream> SpdySession::GetActivePushStream(
(...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 if (it == pending_callback_map_.end()) 1734 if (it == pending_callback_map_.end())
1721 return; 1735 return;
1722 1736
1723 OldCompletionCallback* callback = it->second.callback; 1737 OldCompletionCallback* callback = it->second.callback;
1724 int result = it->second.result; 1738 int result = it->second.result;
1725 pending_callback_map_.erase(it); 1739 pending_callback_map_.erase(it);
1726 callback->Run(result); 1740 callback->Run(result);
1727 } 1741 }
1728 1742
1729 } // namespace net 1743 } // namespace net
OLDNEW
« net/socket/ssl_client_socket_pool.cc ('K') | « net/spdy/spdy_session.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698