OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <map> | 9 #include <map> |
10 #include <utility> | 10 #include <utility> |
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
730 const SettingsMap& initial_settings, | 730 const SettingsMap& initial_settings, |
731 TimeFunc time_func, | 731 TimeFunc time_func, |
732 ServerPushDelegate* push_delegate, | 732 ServerPushDelegate* push_delegate, |
733 ProxyDelegate* proxy_delegate, | 733 ProxyDelegate* proxy_delegate, |
734 NetLog* net_log) | 734 NetLog* net_log) |
735 : in_io_loop_(false), | 735 : in_io_loop_(false), |
736 spdy_session_key_(spdy_session_key), | 736 spdy_session_key_(spdy_session_key), |
737 pool_(NULL), | 737 pool_(NULL), |
738 http_server_properties_(http_server_properties), | 738 http_server_properties_(http_server_properties), |
739 transport_security_state_(transport_security_state), | 739 transport_security_state_(transport_security_state), |
740 read_buffer_(new IOBuffer(kReadBufferSize)), | 740 // read_buffer_(new IOBuffer(kReadBufferSize)), |
741 stream_hi_water_mark_(kFirstStreamId), | 741 stream_hi_water_mark_(kFirstStreamId), |
742 last_accepted_push_stream_id_(0), | 742 last_accepted_push_stream_id_(0), |
743 unclaimed_pushed_streams_(this), | 743 unclaimed_pushed_streams_(this), |
744 push_delegate_(push_delegate), | 744 push_delegate_(push_delegate), |
745 num_pushed_streams_(0u), | 745 num_pushed_streams_(0u), |
746 num_active_pushed_streams_(0u), | 746 num_active_pushed_streams_(0u), |
747 bytes_pushed_count_(0u), | 747 bytes_pushed_count_(0u), |
748 bytes_pushed_and_unclaimed_count_(0u), | 748 bytes_pushed_and_unclaimed_count_(0u), |
749 in_flight_write_frame_type_(DATA), | 749 in_flight_write_frame_type_(DATA), |
750 in_flight_write_frame_size_(0), | 750 in_flight_write_frame_size_(0), |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1362 } | 1362 } |
1363 | 1363 |
1364 size_t SpdySession::DumpMemoryStats(StreamSocket::SocketMemoryStats* stats, | 1364 size_t SpdySession::DumpMemoryStats(StreamSocket::SocketMemoryStats* stats, |
1365 bool* is_session_active) const { | 1365 bool* is_session_active) const { |
1366 // TODO(xunjieli): Include |pending_create_stream_queues_| when WeakPtr is | 1366 // TODO(xunjieli): Include |pending_create_stream_queues_| when WeakPtr is |
1367 // supported in memory_usage_estimator.h. | 1367 // supported in memory_usage_estimator.h. |
1368 *is_session_active = is_active(); | 1368 *is_session_active = is_active(); |
1369 connection_->DumpMemoryStats(stats); | 1369 connection_->DumpMemoryStats(stats); |
1370 | 1370 |
1371 // |connection_| is estimated in stats->total_size. |read_buffer_| is | 1371 // |connection_| is estimated in stats->total_size. |read_buffer_| is |
1372 // estimated in kReadBufferSize. TODO(xunjieli): Make them use EMU(). | 1372 // estimated in |read_buffer_size|. TODO(xunjieli): Make them use EMU(). |
1373 return stats->total_size + kReadBufferSize + | 1373 size_t read_buffer_size = read_buffer_ ? kReadBufferSize : 0; |
1374 return stats->total_size + read_buffer_size + | |
1374 SpdyEstimateMemoryUsage(spdy_session_key_) + | 1375 SpdyEstimateMemoryUsage(spdy_session_key_) + |
1375 SpdyEstimateMemoryUsage(pooled_aliases_) + | 1376 SpdyEstimateMemoryUsage(pooled_aliases_) + |
1376 SpdyEstimateMemoryUsage(active_streams_) + | 1377 SpdyEstimateMemoryUsage(active_streams_) + |
1377 SpdyEstimateMemoryUsage(unclaimed_pushed_streams_) + | 1378 SpdyEstimateMemoryUsage(unclaimed_pushed_streams_) + |
1378 SpdyEstimateMemoryUsage(created_streams_) + | 1379 SpdyEstimateMemoryUsage(created_streams_) + |
1379 SpdyEstimateMemoryUsage(write_queue_) + | 1380 SpdyEstimateMemoryUsage(write_queue_) + |
1380 SpdyEstimateMemoryUsage(in_flight_write_) + | 1381 SpdyEstimateMemoryUsage(in_flight_write_) + |
1381 SpdyEstimateMemoryUsage(buffered_spdy_framer_) + | 1382 SpdyEstimateMemoryUsage(buffered_spdy_framer_) + |
1382 SpdyEstimateMemoryUsage(initial_settings_) + | 1383 SpdyEstimateMemoryUsage(initial_settings_) + |
1383 SpdyEstimateMemoryUsage(stream_send_unstall_queue_) + | 1384 SpdyEstimateMemoryUsage(stream_send_unstall_queue_) + |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1853 } | 1854 } |
1854 } | 1855 } |
1855 | 1856 |
1856 CHECK(in_io_loop_); | 1857 CHECK(in_io_loop_); |
1857 in_io_loop_ = false; | 1858 in_io_loop_ = false; |
1858 | 1859 |
1859 return result; | 1860 return result; |
1860 } | 1861 } |
1861 | 1862 |
1862 int SpdySession::DoRead() { | 1863 int SpdySession::DoRead() { |
1864 DCHECK(!read_buffer_); | |
1863 CHECK(in_io_loop_); | 1865 CHECK(in_io_loop_); |
1864 | 1866 |
1865 CHECK(connection_); | 1867 CHECK(connection_); |
1866 CHECK(connection_->socket()); | 1868 CHECK(connection_->socket()); |
1867 read_state_ = READ_STATE_DO_READ_COMPLETE; | 1869 read_state_ = READ_STATE_DO_READ_COMPLETE; |
1868 int rv = ERR_READ_IF_READY_NOT_IMPLEMENTED; | 1870 int rv = ERR_READ_IF_READY_NOT_IMPLEMENTED; |
1871 read_buffer_ = new IOBuffer(kReadBufferSize); | |
1869 if (base::FeatureList::IsEnabled(Socket::kReadIfReadyExperiment)) { | 1872 if (base::FeatureList::IsEnabled(Socket::kReadIfReadyExperiment)) { |
1870 rv = connection_->socket()->ReadIfReady( | 1873 rv = connection_->socket()->ReadIfReady( |
1871 read_buffer_.get(), kReadBufferSize, | 1874 read_buffer_.get(), kReadBufferSize, |
1872 base::Bind(&SpdySession::PumpReadLoop, weak_factory_.GetWeakPtr(), | 1875 base::Bind(&SpdySession::PumpReadLoop, weak_factory_.GetWeakPtr(), |
1873 READ_STATE_DO_READ)); | 1876 READ_STATE_DO_READ)); |
1874 // TODO(xunjieli): Follow-up CL to release |read_buffer_|. | 1877 if (rv == ERR_IO_PENDING) |
DmitrySkiba
2017/03/06 21:42:37
Are we killing buffer with read operation in progr
xunjieli
2017/03/06 21:58:59
Great question. The new ReadIfReady() method that
xunjieli
2017/03/06 22:00:51
Btw, if you apply the CL linked above and start Ch
| |
1875 // https://crbug.com/690915. | 1878 read_buffer_ = nullptr; |
1876 } | 1879 } |
1877 if (rv == ERR_READ_IF_READY_NOT_IMPLEMENTED) { | 1880 if (rv == ERR_READ_IF_READY_NOT_IMPLEMENTED) { |
1878 // Fallback to regular Read(). | 1881 // Fallback to regular Read(). |
1879 return connection_->socket()->Read( | 1882 return connection_->socket()->Read( |
1880 read_buffer_.get(), kReadBufferSize, | 1883 read_buffer_.get(), kReadBufferSize, |
1881 base::Bind(&SpdySession::PumpReadLoop, weak_factory_.GetWeakPtr(), | 1884 base::Bind(&SpdySession::PumpReadLoop, weak_factory_.GetWeakPtr(), |
1882 READ_STATE_DO_READ_COMPLETE)); | 1885 READ_STATE_DO_READ_COMPLETE)); |
1883 } | 1886 } |
1884 if (rv == ERR_IO_PENDING) | 1887 if (rv == ERR_IO_PENDING) { |
1885 read_state_ = READ_STATE_DO_READ; | 1888 read_state_ = READ_STATE_DO_READ; |
1889 return ERR_IO_PENDING; | |
1890 } | |
1886 return rv; | 1891 return rv; |
1887 } | 1892 } |
1888 | 1893 |
1889 int SpdySession::DoReadComplete(int result) { | 1894 int SpdySession::DoReadComplete(int result) { |
1895 DCHECK(read_buffer_); | |
1890 CHECK(in_io_loop_); | 1896 CHECK(in_io_loop_); |
1891 | 1897 |
1892 // Parse a frame. For now this code requires that the frame fit into our | 1898 // Parse a frame. For now this code requires that the frame fit into our |
1893 // buffer (kReadBufferSize). | 1899 // buffer (kReadBufferSize). |
1894 // TODO(mbelshe): support arbitrarily large frames! | 1900 // TODO(mbelshe): support arbitrarily large frames! |
1895 | 1901 |
1896 if (result == 0) { | 1902 if (result == 0) { |
1897 DoDrainSession(ERR_CONNECTION_CLOSED, "Connection closed"); | 1903 DoDrainSession(ERR_CONNECTION_CLOSED, "Connection closed"); |
1898 return ERR_CONNECTION_CLOSED; | 1904 return ERR_CONNECTION_CLOSED; |
1899 } | 1905 } |
(...skipping 17 matching lines...) Expand all Loading... | |
1917 data += bytes_processed; | 1923 data += bytes_processed; |
1918 | 1924 |
1919 if (availability_state_ == STATE_DRAINING) { | 1925 if (availability_state_ == STATE_DRAINING) { |
1920 return ERR_CONNECTION_CLOSED; | 1926 return ERR_CONNECTION_CLOSED; |
1921 } | 1927 } |
1922 | 1928 |
1923 DCHECK_EQ(buffered_spdy_framer_->spdy_framer_error(), | 1929 DCHECK_EQ(buffered_spdy_framer_->spdy_framer_error(), |
1924 SpdyFramer::SPDY_NO_ERROR); | 1930 SpdyFramer::SPDY_NO_ERROR); |
1925 } | 1931 } |
1926 | 1932 |
1933 read_buffer_ = nullptr; | |
1927 read_state_ = READ_STATE_DO_READ; | 1934 read_state_ = READ_STATE_DO_READ; |
1928 return OK; | 1935 return OK; |
1929 } | 1936 } |
1930 | 1937 |
1931 void SpdySession::PumpWriteLoop(WriteState expected_write_state, int result) { | 1938 void SpdySession::PumpWriteLoop(WriteState expected_write_state, int result) { |
1932 CHECK(!in_io_loop_); | 1939 CHECK(!in_io_loop_); |
1933 DCHECK_EQ(write_state_, expected_write_state); | 1940 DCHECK_EQ(write_state_, expected_write_state); |
1934 | 1941 |
1935 DoWriteLoop(expected_write_state, result); | 1942 DoWriteLoop(expected_write_state, result); |
1936 | 1943 |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3175 if (!queue->empty()) { | 3182 if (!queue->empty()) { |
3176 SpdyStreamId stream_id = queue->front(); | 3183 SpdyStreamId stream_id = queue->front(); |
3177 queue->pop_front(); | 3184 queue->pop_front(); |
3178 return stream_id; | 3185 return stream_id; |
3179 } | 3186 } |
3180 } | 3187 } |
3181 return 0; | 3188 return 0; |
3182 } | 3189 } |
3183 | 3190 |
3184 } // namespace net | 3191 } // namespace net |
OLD | NEW |